在Python中一次性唤醒一个等待的线程

2024-09-30 20:33:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python对象,它通过异步I/O回调定期更新。一些线程需要等待此对象被更新。在

这个“更新”事件是一个即时事件,并且告诉等待线程唤醒的操作应该是一个原子事件。在

我已经找到了一些解决方案:

  • Condition对象需要您首先获得一个锁,这是不可能的:我需要几个线程来不受阻碍地到达wait,而不必争着获取锁。在
  • 事件对象生成一个争用条件:如果一个线程在事件被清除之前到达wait,它将不会等待,相反,事件可以在任何线程被唤醒之前被清除。在

最好的解决方案是相当于POSIX pause/kill组合,但对于线程(至少是我能想到的最好的解决方案)。在

所以,问题是:

  • pause/kill组合是否具有python2.7线程的等效项,哪一个?在
  • 如果没有,对于我的用例,使用python2.7标准库,什么是最好的折衷方案(就可靠性而言)?在

以下是与我希望实现的目标类似的事情:

# Would be a derived of threading.Event
# and the perfect solution for me, if it existed
ev = InstantEvent()

def update(*args):
    # do stuff with args
    ev.notifyAll()

if __name__ == "__main__":
    # do startup stuff
    ev.wait()
    # do more stuff

Tags: 对象if事件args解决方案condition条件线程
1条回答
网友
1楼 · 发布于 2024-09-30 20:33:15

如您所见,每个事件都可以用wait()等待事件对象。更重要的是:他们可以定期检查事件(等待超时),然后在循环中执行自己的工作。回调完成后将设置事件。你可以通过一个接一个的检查来组合几个事件,等等。我不能理解你的问题。如果您希望对事件进行独占反应,请使用信号量而不是event:来只允许一个线程/侦听器处理回调完成。查看有关Python线程的更多信息:https://docs.python.org/3/library/threading.html

相关问题 更多 >