5

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

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

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

4

2 回答 2

7

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

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

于 2013-12-15T21:58:55.423 回答
7

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

因此,文档示例如下:

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

该文件还指出:

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

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

于 2012-07-09T08:59:15.587 回答