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中DJANGO简单测试实例
May 11 Python
python实现中文转换url编码的方法
Jun 14 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
Python Cookie 读取和保存方法
Dec 28 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
pandas to_excel 添加颜色操作
Jul 14 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 Python
用Python远程登陆服务器的步骤
Apr 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设计模式 State (状态模式)
2011/06/26 PHP
php 函数中使用static的说明
2012/06/01 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
js模块加载方式浅析
2017/08/12 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
Python装饰器知识点补充
2018/05/28 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
django自带调试服务器的使用详解
2019/08/29 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
python 如何在测试中使用 Mock
2021/03/01 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
2015年销售部工作总结范文
2015/04/27 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL