【python】多线程之通过event事件在多线程间通信的代码示例

2023-12-14 18:29:08

前言:

大家好,今天来讲一下python里的threading.Event类的使用,这个类使用简单,功能强大,如果你的用法得当的话,对一些高级功能的实现会很有帮助,典型的使用场景就是代码解耦,再或者就是数据流从a到b端的持续处理,需要a端发送数据,b端接收到后处理,那么接下来我们直奔主题,来看一下怎么在python里使用事件吧。

一、说明

  1. 在python中可以使用Event发送事件,再通过其他部分代码进行监听,主要用来在不同线程之间传递数据。能做到在不同线程之间优雅的传递数据,或者起到通知接收方的目的。
  2. 这样做的好处就是可以解除代码之间的耦合,提升代码的可维护性,很方便后续对发送和接收部分的代码各自拓展和维护。
  3. Event常用的有三个方法:set、clear、wait
  4. 使用流程: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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。