У меня есть несколько потоков, которые ожидают события, выполняют какое-то действие, а затем снова ждут события.Другой поток вызовет событие, когда это будет уместно.
Я не могу найти способ гарантировать, что каждый ожидающий поток срабатывает ровно один раз после установки события.В настоящее время у меня есть триггерный поток, установил его, немного поспал, затем очистил его.К сожалению, это приводит к тому, что ожидающие потоки захватывают заданное событие много раз или вообще ничего.
Я не могу просто заставить поток запуска порождать потоки ответов, чтобы запустить их один раз, потому что они являются ответами на запросы, сделанные из других мест.
Короче говоря: в Python, как я могу иметьпоток установил событие и удостоверился, что каждый ожидающий поток воздействует на событие ровно один раз до его очистки?
Обновление:
Я пытался настроить его с помощьюблокировка и очередь, но это не работает.Вот что у меня есть:
# Globals - used to synch threads
waitingOnEvent = Queue.Queue
MainEvent = threading.Event()
MainEvent.clear() # Not sure this is necessary, but figured I'd be safe
mainLock = threading.Lock()
def waitCall():
mainLock.acquire()
waitingOnEvent.put("waiting")
mainLock.release()
MainEvent.wait()
waitingOnEvent.get(False)
waitingOnEvent.task_done()
#do stuff
return
def triggerCall():
mainLock.acquire()
itemsinq = waitingOnEvent.qsize()
MainEvent.set()
waitingOnEvent.join()
MainEvent.clear()
mainLock.release()
return
В первый раз itemsinq правильно отражает количество ожидающих вызовов, но только первый ожидающий поток, который совершит вызов, пройдет через него.С этого момента itemsinq всегда равен 1, и ожидающие потоки сменяются;каждый раз, когда происходит вызов триггера, происходит следующее.
Обновление 2 Кажется, что только один из потоков event.wait () пробуждается , и все жеqueue.join () работает.Это наводит меня на мысль, что один ожидающий поток просыпается, берет из очереди и вызывает task_done (), и что единственный get () / task_done () каким-то образом очищает очередь и разрешает join ().Затем триггерный поток завершает join (), очищает событие и, таким образом, предотвращает прохождение других ожидающих потоков.Почему очередь регистрируется как пустая / завершенная только после одного вызова get / task_done?
Кажется, что просыпается только один, даже если я закомментирую queue.get () и очередь.task_done () и повесьте триггер, чтобы он не мог очистить событие.