在Python的内部,一个事件是通过一个Condition()
对象实现的。
当调用event.set()
方法时,会调用条件的notify_all()
(在获取锁以确保不会中断之后),则所有线程都会收到通知(只有在通知所有线程时才会释放该锁),所以你可以确定所有的线程都会被有效地通知。
现在,清除事件后通知不是一个问题....直到你不想检查等待线程中的事件值与event.is_set()
,但你只需要这种检查,如果你是等待超时。
例子:
伪的作品:
#in main thread
event = Event()
thread1(event)
thread2(event)
...
event.set()
event.clear()
#in thread code
...
event.wait()
#do the stuff
伪代码,可能无法正常工作:
#in main thread
event = Event()
thread1(event)
thread2(event)
...
event.set()
event.clear()
#in thread code
...
while not event.is_set():
event.wait(timeout_value)
#do the stuff
编辑:在Python> = 2.7,你仍然可以等待一个事件超时并确保事件的状态:
event_state = event.wait(timeout)
while not event_state:
event_state = event.wait(timeout)
请注意,在Python 2.7中,如果你指定了超时时间,那么从event.wait()返回的值是不可靠的。请参阅https://bugs.python.org/issue13502 – 2017-12-18 17:11:18