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

时间:2017-05-30 07:33:48

标签: python multithreading python-2.7 thread-synchronization

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

这"更新" event是一个瞬时事件,并且告诉等待线程唤醒的动作应该是原子事件。

我找了几个解决方案:

  • 条件对象需要你首先获得一个锁,这是一个禁忌:我需要几个线程才能不受阻碍地到达wait,而不需要争取锁定。
  • 事件对象生成竞争条件:如果线程在事件被清除之前到达wait,则它不会等待,相反,事件可以在任何线程被唤醒之前被清除。 / LI>

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

所以,问题:

  • pause / kill组合是否具有Python 2.7线程的等效项,以及哪一个?
  • 如果没有,使用Python 2.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

1 个答案:

答案 0 :(得分:0)

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