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的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
Python实现搜索算法的实例代码
Jan 02 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
python输入中文的实例方法
Sep 14 Python
python实现一个简单RPC框架的示例
Oct 28 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
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
js查错流程归纳
2012/05/04 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
浅析jQuery1.8的几个小变化
2013/12/10 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
Python 列表list使用介绍
2014/11/30 Python
python操作mysql代码总结
2018/06/01 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
五年级音乐教学反思
2014/02/06 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
民主评议党员个人总结
2015/02/13 职场文书