【python】多线程之通过event事件在多线程间通信的代码示例
2023-12-14 18:29:08
前言:
大家好,今天来讲一下python里的threading.Event类的使用,这个类使用简单,功能强大,如果你的用法得当的话,对一些高级功能的实现会很有帮助,典型的使用场景就是代码解耦,再或者就是数据流从a到b端的持续处理,需要a端发送数据,b端接收到后处理,那么接下来我们直奔主题,来看一下怎么在python里使用事件吧。
一、说明
- 在python中可以使用Event发送事件,再通过其他部分代码进行监听,主要用来在不同线程之间传递数据。能做到在不同线程之间优雅的传递数据,或者起到通知接收方的目的。
- 这样做的好处就是可以解除代码之间的耦合,提升代码的可维护性,很方便后续对发送和接收部分的代码各自拓展和维护。
- Event常用的有三个方法:set、clear、wait
- 使用流程:set方法调用后,wait部分的代码会接收到该事件通知,此时不再阻塞,会继续执行wait之后的代码,在调用clear方法之前,会不停地触发该事件,所以如果功能的目的不是无限触发wait后的代码的话,则调用set后需要调用clear来停止,如果事件通过其他类继承过后添加了自己的属性的话,那么此时可以读取该事件自定义的内容,参考代码部分的ResultEvent
threading.Event类的官方描述参考这里。
二、代码部分
测试使用的代码:
from datetime import datetime
from threading import Thread, Event
import time
class ResultEvent(Event):
data = None
def __init__(self, data):
super().__init__()
self.data = data
def now_str():
return datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")
# 事件的发送和接收,多线程演示
def multi_thread_event():
def send_event_loop(e: ResultEvent):
while True:
e.set()
e.clear()
print("[{}]send event,data:{}\n".format(now_str(), e.data))
time.sleep(5)
def receive_event_loop1(e: ResultEvent):
while True:
e.wait()
print("[{}]loop1 rec event,data:{}".format(now_str(), e.data))
def receive_event_loop2(e: ResultEvent):
while True:
e.wait()
print("[{}]loop2 rec event,data:{}".format(now_str(), e.data))
ok_event = ResultEvent("{'flag':'ok'}")
Thread(target=send_event_loop, args=(ok_event,)).start()
Thread(target=receive_event_loop1, args=(ok_event,)).start()
Thread(target=receive_event_loop2, args=(ok_event,)).start()
if __name__ == '__main__':
multi_thread_event()
输出结果示例:
[2023-12-14 17:38:56]send event,data:{'flag':'ok'}
[2023-12-14 17:38:56]loop1 rec event,data:{'flag':'ok'}
[2023-12-14 17:38:56]loop2 rec event,data:{'flag':'ok'}
[2023-12-14 17:39:01]send event,data:{'flag':'ok'}
[2023-12-14 17:39:01]loop2 rec event,data:{'flag':'ok'}
[2023-12-14 17:39:01]loop1 rec event,data:{'flag':'ok'}
三、结语
如果觉得写的还可以或者对你有帮助,恳请各位看官动动手指点个赞或者收藏,后续有机会仍然会分享一些比较实用的API,那我们就下次再见~
文章来源:https://blog.csdn.net/zx156955/article/details/134999468
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!