【问题标题】:Python condition variable timeoutPython条件变量超时
【发布时间】:2012-07-09 08:47:34
【问题描述】:

我有 thread1 正在等待来自 thread2 的条件。但可能是 thread2 从来没有发出条件变量的信号。所以我在线程 1 中为wait 调用添加了超时,如下所示:

cv.acquire()
cv.wait(1.0)
cv.release()

我如何知道条件变量是否已发出信号或发生超时? wait 似乎没有返回任何值。 Condition Objects 上的 python 文档没有提供任何线索。

【问题讨论】:

    标签: python multithreading condition-variable


    【解决方案1】:

    你不应该关心;典型情况是您的等待线程检查某个共享状态,直到该状态与某个条件匹配。

    documentation example 是这样的:

    cv.acquire()
    while not an_item_is_available():
        cv.wait()
    get_an_available_item()
    cv.release()
    

    并且文档还指出:

    […] 对特定状态变化感兴趣的线程反复调用 wait() 直到它们看到所需的状态

    如果您确实迫切需要区分超时和信号,则需要改用Event objects;如果未设置标志(仅在达到超时时发生),则对 Event 对象的 .wait(timeout) 调用返回 None

    【讨论】:

    • 此外,“发生超时”并不排除“达到所需条件”。例如,假设您等待 0.1 秒,并且恰好在 0.1 秒之后,就在超时到期时,您等待的事件也发生了。如果您尝试使用“是否发生超时”作为指标,您最终会遇到竞争条件。
    • 但是我需要专门处理超时的情况!如果超时,我将关闭我的进程。我不在乎是否在超时后立即满足条件:无论如何我都会关闭该过程。对我来说,超时是一个重要的信号。如果条件变量没有提供这些信息,可能不是一个合适的方法来实现我想要的。
    • 还有更多:我不想永远检查 an_item_is_available 是否可用。我正在等待它在 1 秒内可用。如果不是,那么运气不好,我会继续前进。
    【解决方案2】:

    Martijn 的回答对于旧版本的 Python 是正确的,但是在 3.2 中,这种情况发生了变化。 wait() 方法现在在超时时返回 False

    有趣的是,现在还有一个wait_for() 方法。这需要一个谓词方法,并等待它评估为True。超时后,它返回 False。

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2011-12-28
      • 2015-01-26
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多