事件对象
1、啥是事件对象
threading.Event()
是 Python threading
模块提供的一个同步原语,用于在多线程程序中协调线程之间的操作。它非常有用,可以让一个或多个线程等待某个事件的发生,直到该事件被触发后,所有等待该事件的线程会被激活。
具体来说,可以将 Event
对象看作是一个标志位,当调用 Event.set()
方法时,该标志位变为 True,而调用 Event.clear()
方法则会将其重置为 False。线程可以通过调用 Event.wait()
方法来等待该标志位变为 True,如果在调用 wait()
之前标志位已经为 True,线程可以继续执行;否则,线程将一直等待,直到其他线程调用了 set()
方法使得标志位为 True。
这样,使用 Event
对象就可以实现线程间的同步操作,比如控制线程的启动、暂停、终止等。
2、应用场景
- 线程的同步:可以使用事件对象来确保线程按照特定的顺序执行。例如,你可以创建两个线程,其中一个线程负责初始化某些数据,而另一个线程在初始化完成后才能执行操作。
- 线程的等待:如果你需要一个或多个线程等待另一个线程完成某个任务,你可以使用事件对象来实现。当任务完成时,可以发送一个信号给等待线程。
- 多线程编程中的信号处理:在多线程应用程序中,有时需要向一个或多个线程发送信号,以指示某个事件已经发生。此时,你可以使用事件对象来实现这种信号处理机制。
3、简单示例
# SuperFastPython.com # example of using an event object from time import sleep from random import random from threading import Thread from threading import Event # target task function def task(event, number): # wait for the event to be set mm = f'我是{number}' print(mm) event.wait() # begin processing value = random() sleep(value) print(f'Thread {number} got {value}') # create a shared event object event = Event() # create a suite of threads for i in range(5): thread = Thread(target=task, args=(event, i)) thread.start() # block for a moment print('Main thread blocking...') print("我要开始操作了") sleep(2) # start processing in all threads event.set() # wait for all the threads to finish... result: 我是0 我是1 我是2 我是3 我是4 Main thread blocking... 我要开始操作了 Thread 1 got 0.37977761175306546 Thread 0 got 0.3833190476814933 Thread 3 got 0.4714273460018731 Thread 2 got 0.5125375655170216 Thread 4 got 0.5952260410080865
参考文档:https://superfastpython.com/thread-event-object-in-python/#Need_for_an_Event_Object