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设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
全面了解python字符串和字典
Jul 07 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
python批量赋值操作实例
Oct 22 Python
Django2.1.3 中间件使用详解
Nov 26 Python
Django ModelForm组件使用方法详解
Jul 23 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
用Python绘制漫步图实例讲解
Feb 26 Python
Python模块相关知识点小结
Mar 09 Python
keras实现多种分类网络的方式
Jun 11 Python
python mock测试的示例
Oct 19 Python
python简单验证码识别的实现过程
Jun 20 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不使用插件导出excel的简单方法
2014/03/04 PHP
限制文本字节数js代码
2007/03/06 Javascript
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
js实现一个简易计算器
2020/03/30 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
python实现复制整个目录的方法
2015/05/12 Python
python中字符串前面加r的作用
2015/06/04 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python2与Python3的区别实例总结
2019/04/17 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
高中毕业自我鉴定
2013/12/22 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
班主任寄语2015
2015/02/26 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
写给同事的离职感言
2015/08/04 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server