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获取mp3文件信息的方法
Jun 15 Python
Python复制文件操作实例详解
Nov 10 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
python批量创建指定名称的文件夹
Mar 21 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
python实现实时视频流播放代码实例
Jan 11 Python
MATLAB数学建模之画图汇总
Jul 16 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开发入门教程之面向对象
2006/12/05 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
学习ExtJS table布局
2009/10/08 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
详解Python正则表达式re模块
2019/03/19 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
详解Django admin高级用法
2019/11/06 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
教师专业自荐书范文
2014/02/10 职场文书
停电放假通知
2015/04/14 职场文书
小学班主任工作随笔
2015/08/15 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android