【问题标题】:One-time wake a waiting thread in Python一次性唤醒 Python 中的等待线程
【发布时间】:2017-05-30 07:33:47
【问题描述】:

我有一个通过异步 I/O 回调定期更新的 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

【问题讨论】:

    标签: python multithreading python-2.7 thread-synchronization


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2021-08-09
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      相关资源
      最近更新 更多