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 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python记录详细调用堆栈日志的方法
May 05 Python
Python读写unicode文件的方法
Jul 10 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
python如何去除字符串中不想要的字符
Jul 05 Python
python进行TCP端口扫描的实现
Dec 21 Python
Python基本socket通信控制操作示例
Jan 30 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
python属于解释型语言么
Jun 15 Python
python manim实现排序算法动画示例
Aug 14 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怎样调用MSSQL的存储过程
2006/10/09 PHP
php实现的CSS更新类实例
2014/09/22 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
CI框架常用方法小结
2016/05/17 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
python数据结构之图的实现方法
2015/07/08 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
python groupby 函数 as_index详解
2019/12/16 Python
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
大学生自我鉴定
2013/12/08 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
2015年组织部工作总结
2015/04/03 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书