2017-05-30 47 views
0

我有一个从异步I/O回调中定期更新的Python对象。有几个线程需要等待这个对象被更新。一次唤醒Python中的等待线程

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

我已经找了几个解决方案:

  • 条件对象需要你首先获取锁,这是一个不走的:我需要多个线程到达wait入无人之境,不战而获取锁。
  • 事件对象会产生竞争条件:如果线程在事件清除之前达到wait,则不会等待,相反,可以在任何线程唤醒之前清除该事件。

最好的解决办法是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 

回答

0

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