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使用os模块的os.walk遍历文件夹示例
Jan 27 Python
python中尾递归用法实例详解
Apr 28 Python
详细解读Python中的__init__()方法
May 02 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
Dec 16 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 Python
python实现马丁策略的实例详解
Jan 15 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
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
表单内同名元素的控制
2006/11/22 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
JS如何生成动态列表
2020/09/22 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
详解Python异常处理中的Finally else的功能
2017/12/29 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python的re模块使用方法详解
2019/07/26 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
市场营销专业应届生自荐信
2014/06/19 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL