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时间戳与时间字符串互相转换实例代码
Nov 28 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
Python+微信接口实现运维报警
Aug 27 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
python中关于for循环的碎碎念
Jun 30 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
selenium+Chrome滑动验证码破解二(某某网站)
Dec 17 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
python如何查看安装了的模块
Jun 23 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
Jun 29 Python
Python如何实现感知器的逻辑电路
Dec 25 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中curl_multi的应用
2013/07/17 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
理解javascript模块化
2016/03/28 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
python获取list下标及其值的简单方法
2016/09/12 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
Python基础之文件读取的讲解
2019/02/16 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
python读写配置文件操作示例
2019/07/03 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Django对models里的objects的使用详解
2019/08/17 Python
Django 框架模型操作入门教程
2019/11/05 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
PHP实现考试倒计时功能代码
2021/04/16 PHP
利用python调用摄像头的实例分析
2021/06/07 Python
flex弹性布局详解
2022/03/20 HTML / CSS