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

我们都知道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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)

void RCC_Config(void){SystemInit(); //系统时钟初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE | RCC_APB2Periph_G…

NetBeans Java EE技巧9:从数据库创建JSF应用程序

您需要非常快速地创建数据库前端吗? NetBeans IDE允许人们以极少的编码就非常快速地为一组数据库表开发JSF应用程序前端。 现在,本教程既是老歌,又是老歌……对于那些不了解它的人来说,值得再次提及。 首先,创建您的应…

[模板]树链剖分

用途 我想把一个本来是线性的东西放到树上做,维护路径或者是子树的各种性质,那就用树剖呗 它可以套线段树、树状数组、ST表(以及其他我不知道的) 做法 我们考虑把树分成一条条链,然后对每条链维护我们的数据结构&#…

sql server 2005单独添加mdf文件

我把原来的数据库分离后,直接把日志文件给干掉了。原来在SQL 2000里经常这么干,只用一个mdf就附加了。没想到sql2005居然不行。我试验了一圈 终于找到一个成功的方法。转载,供后来者参考。SQL2005 如何在没有日志文件的情况下如何恢复MDF数据…

低压抽屉柜常见故障处理方法_低压配电设备常见故障分析,处理办法介绍

低压配电线路作为配电网络中主要的一部分,在其运行的过程中直接影响着人民的生命财产安全。配电线路是电力输送的终端,对于提高电力质量有着至关重要的作用。但由于配电线路走径的复杂性,人为因素和设备因素,都会给低压配电设备造…

关于C语言中的'\?'和%%

关于C语言中的\?和%% 一、引语 我们知道C/C中有四个非字母的字符需要用转义字符来表示:单引号 , 双引号 " , 反斜杆 \ 和问号 ? 显然这是因为它们本身有特殊的含义,所以要用转义字符来表示他们自己,单引号用来表示单个字符&#xff0…

mockito 使用_用Mockito回答

mockito 使用在编写单元测试时 ,必须记住不要依赖于外部组件。 为了避免这种情况,我们使用了模拟框架,对我而言,最容易使用的是Mockito 。 在本文中,我们将看到在Mockito中使用的一种“高级”技术,可以使用…

jQuery常用操作

jQuery jQuery是一个轻量级的JS库&#xff0c;是一个被封装好的JS文件&#xff0c;提供了更为简便的元素操作方式&#xff0c;jQuery封装了DOM。 使用jQuery 引入jQuery文件 <scrtipt srcjquery-1.11.3.js> </script> 注意&#xff1a;引入必须放在其他jQuery操作之…

python tab和空格混用_我的 Python 编码规范

python 文件的组成为了便于描述&#xff0c;先上一个 demo#!/usr/bin/env python# -*- coding: utf-8 -*-"""通常这里是关于本文档的说明(docstring)&#xff0c;须以半角的句号、 问号或惊叹号结尾!本行之前应当空一行&#xff0c;继续完成关于本文档的说明如果…

Twitter创始人Jack Dorsey的每日必做和不做清单

Twitter创始人Jack Dorsey显然是这段时间以来技术界的中心人物&#xff0c;不仅发表了一系列的文章&#xff0c;而且一本反映Twitter早期岁月的书也即将出版。今天&#xff0c;他又在Y Combinator的Startup School上发表了讲话&#xff0c;不过在谈话中Dorsey回避了一切不必要及…

JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性

Java 8引入了JSR-308&#xff0c;它为Java语言添加了新的注释功能。 最重要的是&#xff1a;键入注释。 现在可以像下面这样设计怪物了&#xff1a; 比注解更疯狂的是类型注解。 在数组上。 谁认为这是有效的Java代码&#xff1f; pic.twitter.com/M9fSRRerAD — Lukas Eder&…

Linux NTP服务配置 for Oracle RAC

安装Oracle 11g RAC时&#xff0c;我们需要配置ntp服务。在使用虚拟机的情况下对于时钟同步方式的配置有很多种方式&#xff0c;可以使用vmware自带的时钟同步功能&#xff0c;也可以直接将本地的一个节点用作时间服务器。本文介绍直接配置ntp方式的时钟服务器。1、查看两节点的…

java字符编码方式总结

java字符编码方式总结一、概要在JAVA应用程序特别是基于WEB的程序中&#xff0c;经常遇到字符的编码问题。为了防止出现乱码&#xff0c;首先需要了解JAVA是如何处理字符的&#xff0c;这样就可以有目的地在输入/输出环节中增加必要的转码。其次&#xff0c;由于各种服务器有不…

按键扫描

unsigned char Trg,cont,num;void key_sm(void) { uchar Read;ReadP0^0xff;TrgRead&(Read^cont);contRead; } void key_hs(){  switch(Trg)   {     case 0x01:       num;     break;     case 0x02:       num--;     break;     d…

Mathematica函数大全

一、运算符及特殊符号 Line1; 执行Line&#xff0c;不显示结果 Line1,line2 顺次执行Line1&#xff0c;2&#xff0c;并显示结果 ?name 关于系统变量name 的信息 ??name 关于系统变量name 的全部信息 !command 执行Dos 命令 n! N 的阶乘 !!filename 显示文件内容 <<fi…

oem是代工还是贴牌_食用油OEM贴牌代工业务要注意哪些问题?

近年来食用油OEM业务逐渐增加&#xff0c;OEM是英文 Original Equipment Manufacturer的缩写&#xff0c;被译为代工生产或贴牌生产&#xff0c;通常是指品牌商委托有生产能力且品质有保证的油脂加工厂来生产食用油产品&#xff0c;对自己及对方的品牌不会有冲突&#xff0c;且…

java 简化判断_简化Java内存分析

java 简化判断作为一名典型的Java开发人员&#xff0c;除了遵循关闭连接&#xff0c;流等典型的最佳实践外&#xff0c;我从未监视过应用程序的内存使用情况。最近&#xff0c;我们在JBoss服务器中遇到了一些问题&#xff0c;不得不深入研究内存管理Java中最好的事情之一是&…

DRF的序列化组件

rest rest下的url url唯一代表资源&#xff0c;http请求方式来区分用户行为 url的设计规范 GET&#xff1a; 127.0.0.1:9001/books/       # 获取所有数据 GET: 127.0.0.1:9001/books/{id}      # 获取单条数据 POST&#xff1a; 127.0.0.1:9001/books/      # 增…

15crmo焊接后多长时间探伤_承压设备渗透探伤检测方法简单操作思路

啥是渗透检测渗透检测俗称渗透探伤&#xff0c;是一种以毛细管作用原理为基础用于检查表面开口缺陷的无损检测方法。它与射线检测、超声检测、磁粉检测和涡流检测一起&#xff0c;并称为5种常规的无损检测方法&#xff0c;渗透检测始于本世纪初&#xff0c;是目视检查以外最早应…