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的dict字典结构操作方法学习笔记
May 07 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
Python Numpy库的超详细教程
Apr 06 Python
python神经网络学习 使用Keras进行简单分类
May 04 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笔记之:php数组相关函数的使用
2013/04/26 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
python super用法及原理详解
2020/01/20 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
个人简历自我评价
2014/01/06 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
二手车转让协议书
2015/01/29 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
Python Numpy库的超详细教程
2022/04/06 Python
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL
ubuntu下常用apt命令介绍
2022/06/05 Servers