Возможно, вам придется построить один из других движущихся частей.Например, создайте Queue.Queue()
, для которого каждый слушатель публикует совершенно новый Event()
, который он затем ожидает.Когда пришло время пробудить один из ожидающих потоков, вытолкните элемент в очереди, который ожидал дольше всего - это будет один из этих объектов события, - и освободите поток через event.set()
.
Очевидно, что вы также можете использовать семафор для каждого процесса ожидания, но мне нравится семантика Event
, поскольку это может произойти только один раз, в то время как семафор имеет семантику, что его значение может поддерживать множество ожидающих потоков.
Чтобы настроить систему:
import Queue
big_queue = Queue.Queue()
Затем подождать:
import threading
myevent = threading.Event()
big_queue.put(myevent)
myevent.wait()
И освободить один из ожидающих потоков:
event = big_queue.get()
event.set()
ПолагаюСлабым местом этого подхода является то, что поток, выполняющий набор / выпуск, должен ждать появления ожидающего потока, тогда как настоящий семафор позволил бы продолжить несколько выпусков, даже если никто еще не ждал?