我有许多线程等待事件,执行某些操作,然后再次等待事件。另一个线程将在适当的时候触发该事件。
我无法找到一种方法来确保每个等待线程在设置事件时恰好触发一次。我目前已将触发线程设置为休眠一段时间,然后清除它。不幸的是,这会导致等待线程多次抓取设置的事件,或者根本不抓取。
我不能简单地让触发线程生成响应线程来运行它们一次,因为它们是对从其他地方发出的请求的响应。
简而言之:在Python中,如何让线程设置事件并确保每个等待线程在事件被清除之前对事件执行一次操作?
Update:
我尝试过使用锁和队列来设置它,但它不起作用。这是我所拥有的:
# 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,等待线程轮流;每次触发调用发生时,都会执行下一个调用。
Update 2看起来好像只有一个 event.wait() 线程正在唤醒,但queue.join() 正在工作。这对我来说意味着一个等待线程醒来,从队列中抓取并调用task_done(),并且单个get()/task_done()以某种方式清空队列并允许join()。然后,触发线程完成 join(),清除事件,从而阻止其他等待线程通过。为什么队列只在一次 get/task_done 调用后就注册为空/已完成?
即使我注释掉queue.get()和queue.task_done()并挂起触发器,这样它就无法清除事件,似乎只有一个正在醒来。