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使用稀疏矩阵节省内存实例
Jun 27 Python
在Windows8上的搭建Python和Django环境
Jul 03 Python
Python内置数据类型详解
Aug 18 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
浅谈function(函数)中的动态参数
Apr 30 Python
Python实现选择排序
Jun 04 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 Python
python 深度学习中的4种激活函数
Sep 18 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/07/17 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
php生成HTML文件的类方法
2019/10/11 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python读取xlsx的方法
2018/12/25 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
如何用python写个模板引擎
2021/01/14 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
PHP笔试题
2012/02/22 面试题
商务助理岗位职责
2013/11/13 职场文书
结婚典礼证婚词
2014/01/11 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
党支部承诺书
2015/01/20 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python