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数组定义方法
Apr 13 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Pythony运维入门之Socket网络编程详解
Apr 15 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Django实现网页分页功能
Oct 31 Python
Python进程池Pool应用实例分析
Nov 27 Python
Python递归实现打印多重列表代码
Feb 27 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
基于python实现音乐播放器代码实例
Jul 01 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+js实现异步图片上传实例分享
2014/06/02 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
Javascript实现动态时钟效果
2018/11/17 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
详解Vite的新体验
2021/02/22 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
详解Python3 基本数据类型
2019/04/19 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
python修改文件内容的3种方法详解
2019/11/15 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
美国旅游网站:Tours4Fun
2017/02/17 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
mysql全面解析json/数组
2022/07/07 MySQL