Во внутренних компонентах 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)