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将xml和xsl转换为html的方法
Mar 10 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
《Python学习手册》学习总结
Jan 17 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Python数据类型之Dict字典实例详解
May 07 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
python标准库os库的函数介绍
Feb 12 Python
Python不支持 i ++ 语法的原因解析
Jul 22 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
python 逐步回归算法
Apr 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
微信小程序开发入门基础教程
2017/04/19 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python实现堆栈与队列的方法
2015/01/15 Python
python中的字典操作及字典函数
2018/01/03 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
python中的协程深入理解
2019/06/10 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python Zmail模块简介与使用示例
2020/12/19 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
优秀学生自我鉴定范例
2013/12/18 职场文书
法定授权委托证明书
2014/09/27 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
长江七号观后感
2015/06/11 职场文书