我们都知道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-8import threading
import timeclass Job(threading.Thread):def __init__(self, *args, **kwargs):super(Job, self).__init__(*args, **kwargs)self.__flag = threading.Event()     # 用于暂停线程的标识self.__flag.set()       # 设置为Trueself.__running = threading.Event()      # 用于停止线程的标识self.__running.set()      # 将running设置为Truedef 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()

测试的结果:

  这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待run函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.

  但是这有时也不一定是坏事. 如果run函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码(例如各种close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.

转载于:https://www.cnblogs.com/0xHack/p/9401717.html

Python关于Threading暂停恢复解决办法相关推荐

  1. python下载文件暂停恢复_Python关于Threading暂停恢复解决办法

    我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦s ...

  2. centos 卸载python和yum之后的解决办法

    转载来自:http://www.cnblogs.com/phpandmysql/p/7066399.html centos 卸载python和yum之后的解决办法 网上看到有同学yum不能使用的消息, ...

  3. Python headers not found错误解决办法

    安装Python扩展时,Configure error: Python headers not found错误解决办法 在安装spot时,遇到#include "Python.h" ...

  4. python 错误代码_PYTHON错误代码及解决办法

    (1)用sklearn进行逻辑回归时,建立完模型,由于要预测的数据量很大,无法一次全部预测,只能每次预测一个样本数据, 在每次以列表形式输入数据进行预测时出现: /Users/donganlan/an ...

  5. python—— 写入错误UnicodeEncodeError的解决办法

    在写python爬虫过程中,有时候吧结果写入到txt文件,但是会遇到UnicodeEncodeError. 错误原因-- 把文件内容,写入到文件中时,出错了. 而出错的原因其实是,python系统,在 ...

  6. ArcGIS Python工具箱中文乱码的解决办法

    最近在使用Python开发ArcGIS的一些小工具,主要使用Python工具箱编程实现.但是乱码问题一直很严重,工具的名称.工具输入参数的名称等.不解决乱码问题,代码里如果有中文,虽然ide里没有问题 ...

  7. UOS系统无线网络手动关闭后无法恢复解决办法

    目录 起因 过程 解决办法 建议:急性子可以直接看解决办法,问题解决了或没解决都可以再看下前面的起因和过程. 起因 今天打开电脑后,右下角的无线网络图标变成了两段线的斜杠/,鼠标放上去提示网络已断开, ...

  8. Python无法下载PIL模块解决办法

    1.首先 PIL 不是库名,你可以在cmd中输入 pip install pillow(这个才是PIL库的全名) 声明(pip 是一个现代的,通用的 Python 包管理工具.提供了对 Python ...

  9. 嵌入Python应用时R6034的解决办法

    R6034 指的是:"Anapplication has made an attempt to load the C runtime libraryincorrectly. Please c ...

最新文章

  1. 多变量线性回归程序实现
  2. Function实现ALV Table六:页眉页脚
  3. poj 3189 Steady Cow Assignment(二分+最大流)
  4. php 文件 不更新,php页面不刷新更新数据
  5. 深度分析Spring中的构造器注入
  6. java mvc页面传值方式_详解SpringMVC的ModelAndView传值方法
  7. [BZOJ1101][POI2007]Zap
  8. python处理表格很厉害么_还在用excel?太落伍了,现在都用Python和Jupyter处理数据了...
  9. 一场让我持续懵比的面试
  10. 153. php 引用
  11. 网上邻居搜索到计算机无法打开,网上邻居无法访问您可能没有权限使用网络资源...
  12. 0基础小白,如何入门数学建模?
  13. uniapp引入font-awsome字体图标-疑难解决
  14. java黄金分割_黄金分式与黄金分割数(Java实现)
  15. 原神紫晶块采集点位置在哪 紫晶块采集点路线图详情
  16. 阅读类APP开发的好处有哪些
  17. 利用Python将多张图像合成视频
  18. 人脸识别嵌入式Linux芯片瑞芯微RV1109参数介绍
  19. R语言使用ggplot2绘制直方图
  20. 对我国师生数学学习和教学观念的反思 郇中丹教授

热门文章

  1. QPW 点评点赞日志表(tf_appraise_praise)
  2. Java的访问控制修饰符_访问权限修饰符_访问权限修饰词
  3. oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?
  4. python 实现语音转文字_python3实现语音转文字(语音识别)和文字转语音(语音合成)...
  5. double小数点后最多几位_用了这么多英语学习APP后,我还是最喜欢这4款
  6. Html调用窗口,等待HTML调用window.print()之前写窗口
  7. C语言中for语句的执行过程是什么?
  8. mathtype运行时错误48_在office中无法使用MathType该怎么办?
  9. linux 释放进程res_linux内存查看及释放
  10. 大气校正后的ndvi_Sentinel2 L1C下载、大气校正、重采样