首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用Python中的事件对象重新启动线程?

如何使用Python中的事件对象重新启动线程?
EN

Stack Overflow用户
提问于 2018-06-18 16:42:22
回答 1查看 1.1K关注 0票数 0

我想要创建一个线程并使用一个事件对象来控制它。确切地说,我希望在设置事件对象时执行线程,并反复等待它。

下面是我所想到的一个粗略的逻辑。

代码语言:javascript
运行
AI代码解释
复制
import threading
import time

e = threading.Event()

def start_operation():
    e.wait()

    while e.is_set():
        print('STARTING TASK')

        e.clear()



t1 = threading.Thread(target=start_operation)
t1.start()

e.set()    # first set
e.set()    # second set

我期望t1the first set被命令后运行,并停止运行(因为它内部有e.clear ),然后在the second set被命令之后再次运行。所以,按照我的预期,它应该打印两次“开始任务”。但它只展示了一次,我不明白为什么。在设置事件对象时,我应该如何更改代码,使其再次运行while loop

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 16:57:38

第一个问题是,一旦退出了while循环,就退出了它。更改谓词返回不会改变任何事情。暂时忘掉这些事件,看看下面的代码:

代码语言:javascript
运行
AI代码解释
复制
i = 0
while i == 0:
    i = 1

显然,如果您稍后再次设置i = 0并不重要,对吗?您已经离开了while循环和整个函数。你的代码也在做同样的事情。

只需在整个过程中添加另一个while循环,就可以解决这个问题:

代码语言:javascript
运行
AI代码解释
复制
def start_operation():
    while True:
        e.wait()

        while e.is_set():
            print('STARTING TASK')

            e.clear()

然而,这仍然是行不通的--也许只是偶尔,偶然的。

Event.set不阻塞;它只是立即设置事件,即使已经设置了事件。因此,这里最有可能的控制流是:

  • 后台线程访问e.wait()和块。
  • 主线程访问e.set()并设置事件。
  • 主线程访问e.set()并再次设置事件,没有任何效果。
  • 后台线程唤醒,执行循环一次,在结束时调用e.clear()
  • 后台线程在e.wait()上永远等待。

(事实上,没有办法避免事件漏掉的信号,这实际上是创造条件的原因,而且任何比Win32和…更新的东西都不关心事件…。但这里的条件也是不够的。)

如果希望主线程阻塞直到事件清除,然后再设置它,则不能这样做。您需要一些额外的东西,比如第二个事件,主线程可以等待,后台线程可以设置。

但是,如果要跟踪多个set调用,而不缺少任何调用,则需要使用不同的同步机制。queue.Queue在这里可能有些过分,但是在Python中做起来非常简单,所以让我们使用它吧。当然,您实际上没有任何值可以放在队列中,但这没关系;您只需将一个虚拟值放在那里:

代码语言:javascript
运行
AI代码解释
复制
import queue
import threading

q = queue.Queue()

def start_operation():
    while True:
        _ = q.get()
        print('STARTING TASK')

t1 = threading.Thread(target=start_operation)
t1.start()

q.put(None)
q.put(None)

如果以后想要添加关闭后台线程的方法,只需将其更改为将值粘贴到:

代码语言:javascript
运行
AI代码解释
复制
import queue
import threading

q = queue.Queue()

def start_operation():
    while True:
        if q.get():
            return
        print('STARTING TASK')    

t1 = threading.Thread(target=start_operation)
t1.start()

q.put(False)
q.put(False)
q.put(True)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50919167

复制
相关文章
MyBatis Plus 常用 API 全套教程,看完没有不懂的
注意:-- 真实开发中往往都会有这四个字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)
芋道源码
2021/01/08
1.1K0
MyBatis Plus 常用 API 全套教程,看完没有不懂的
进阶!MyBatis-Plus(基于 Springboot 演示)
这一篇从一个入门的基本体验介绍,再到对于 CRUD 的一个详细介绍,在介绍过程中将涉及到的一些问题,例如逐渐策略,自动填充,乐观锁等内容说了一下,只选了一些重要的内容,还有一些没提及到,具体可以参考官网,简单的看完,其实会发现,如果遇到单表的 CRUD ,直接用 MP 肯定舒服,如果写多表,还是用 Mybatis 多点,毕竟直接写 SQL 会直观一点,MP 给我的感觉,就是方法封装了很多,还有一些算比较是用的插件,但是可读性会稍微差一点,不过个人有个人的看法哇
BWH_Steven
2020/10/10
6560
Mybatis-plus常用API全套教程,看完没有不懂的
注意:-- 真实开发中往往都会有这四个字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)
业余草
2020/12/29
4600
Mybatis-plus常用API全套教程,看完没有不懂的
注意:-- 真实开发中往往都会有这四个字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)
java进阶架构师
2021/01/20
4200
Mybatis-plus常用API全套教程,看完没有不懂的
Mybatis-plus常用API全套教程,看完没有不懂的
注意:-- 真实开发中往往都会有这四个字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)
Java识堂
2021/09/27
3521
Mybatis-plus常用API全套教程,看完没有不懂的
注意:-- 真实开发中往往都会有这四个字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)整理了一份272页MybatisPDF文档
程序员白楠楠
2021/01/19
7220
SpringBoot中的自动代码生成 - 基于Mybatis-Plus
大家好啊,我是汤圆,今天给大家带来的是《SpringBoot中的自动代码生成 - 基于Mybatis-Plus》,希望对大家有帮助,谢谢
汤圆学Java
2021/04/22
1.1K0
基于docker可使用的api
https://github.com/spotify/docker-client
cn華少
2018/09/11
8100
Envoy 基于 API 的动态配置
当在 Envoy 配置中定义了上游集群后,Envoy 需要知道如何解析集群成员,这就是服务发现。端点发现服务(EDS)是 Envoy 基于 gRPC 或者用来获取集群成员的 REST-JSON API 服务的 xDS 管理服务。在本节我们将学习如何使用 REST-JSOn API 来配置端点的自动发现。
我是阳明
2020/06/30
3.2K1
基于GAN的自动驾驶汽车语义分割
语义分割是计算机视觉中的关键概念之一,语义分割允许计算机通过按类型对图像中的对象进行颜色编码。GAN建立在基于真实内容的基础上复制和生成原始内容的概念上,这使它们适合于在街景图像上进行语义分割的任务,不同部分的分割使在环境中导航的代理能够适当地发挥作用。
小白学视觉
2021/03/30
1K0
基于GAN的自动驾驶汽车语义分割
基于curl 的zabbix API调用
1,认证并取得加密字段 curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"user
小小科
2018/05/04
3.1K0
基于curl 的zabbix API调用
基于TRIZ突破汽车芯片技术瓶颈
随着智能化和自动化的发展,汽车行业对于芯片技术越来越依赖。然而,汽车芯片技术发展遇到了瓶颈,如何突破这一瓶颈,成为了业内热议的话题。
用户9972271
2023/05/18
2800
基于 SpringBoot + Vue3.2 + Element Plus 的后台管理系统
TANSCI 基于 SpringBoot + Vue3.2 + Element Plus 的后台管理系统。
默存
2022/06/24
1.5K0
基于 SpringBoot + Vue3.2 + Element Plus 的后台管理系统
点击加载更多

相似问题

UIButton返回时丢失文本标签

21

xamarin表单中的StackLauout标签文本对齐

12

用标签xamarin表格对文本进行对齐

22

对齐页的标签和文本框

44

Xamarin窗体-打开标签时打开的多页

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文