python 线程的暂停, 恢复, 退出详解及实例


Posted in Python onDecember 06, 2016

python 线程 暂停, 恢复, 退出

我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到threading中Event对象的wait方法的描述时.

wait([timeout])

  Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs.

  阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.


  When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).

  This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out.

  当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。

  此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。


  Changed in version 2.7: Previously, the method always returned None.

  2.7版本以前, 这个方法总会返回None.

利用wait的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:

#!/usr/bin/env python
# coding: utf-8

import threading
import time


class Job(threading.Thread):

  def __init__(self, *args, **kwargs):
    super(Job, self).__init__(*args, **kwargs)
    self.__flag = threading.Event()   # 用于暂停线程的标识
    self.__flag.set()    # 设置为True
    self.__running = threading.Event()   # 用于停止线程的标识
    self.__running.set()   # 将running设置为True

  def run(self):
    while self.__running.isSet():
      self.__flag.wait()   # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
      print time.time()
      time.sleep(1)

  def pause(self):
    self.__flag.clear()   # 设置为False, 让线程阻塞

  def resume(self):
    self.__flag.set()  # 设置为True, 让线程停止阻塞

  def stop(self):
    self.__flag.set()    # 将线程从暂停状态恢复, 如何已经暂停的话
    self.__running.clear()    # 设置为False

下面是测试代码:

a = Job()
a.start()
time.sleep(3)
a.pause()
time.sleep(3)
a.resume()
time.sleep(3)
a.pause()
time.sleep(2)
a.stop()

测试的结果:

 python 线程的暂停, 恢复, 退出详解及实例

这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.

但是这有时也不一定是坏事. 如果run函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码(例如各种close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python抓取网页图片示例(python爬虫)
Apr 27 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
python操作ssh实现服务器日志下载的方法
Jun 03 Python
python+Django+apache的配置方法详解
Jun 01 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
解决python xlrd无法读取excel文件的问题
Dec 25 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
浅析python内置模块collections
Nov 15 Python
Python将字典转换为XML的方法
Aug 01 Python
Python如何使用input函数获取输入
Aug 06 Python
python 实现删除文件或文件夹实例详解
Dec 04 #Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 #Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 #Python
Python性能提升之延迟初始化
Dec 04 #Python
python中redis的安装和使用
Dec 04 #Python
Python正则表达式使用范例分享
Dec 04 #Python
Python常用库推荐
Dec 04 #Python
You might like
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php实现ping
2006/10/09 PHP
DISCUZ 分页代码
2007/01/02 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python reduce 函数使用详解
2017/12/05 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
python变量命名的7条建议
2019/07/04 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Django多数据库联用实现方法解析
2020/11/12 Python
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
廉洁使者实施方案
2014/03/29 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
校园安全广播稿范文
2014/09/25 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
捐款仪式主持词
2015/07/04 职场文书
工作简历的自我评价
2019/05/16 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS