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中使用PDB库调试程序
Apr 05 Python
深入探究Python中变量的拷贝和作用域问题
May 05 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
为什么说python适合写爬虫
Jun 11 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 Python
python中数字是否为可变类型
Jul 08 Python
解决python3输入的坑——input()
Dec 05 Python
matlab xlabel位置的设置方式
May 21 Python
pandas中DataFrame重置索引的几种方法
May 24 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 日期时间函数的高级应用技巧
2009/10/10 PHP
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php实现zip文件解压操作
2015/11/03 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
python设置检查点简单实现代码
2014/07/01 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
Wallis官网:英国女装零售商
2020/01/21 全球购物
小学生家长评语大全
2014/02/10 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
药房管理制度范本
2015/08/06 职场文书
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python