我有 thread1 正在等待来自 thread2 的条件。但可能是 thread2 从来没有发出条件变量的信号。所以我wait
在线程 1 的调用中添加了超时,如下所示:
cv.acquire()
cv.wait(1.0)
cv.release()
我如何知道条件变量是否已发出信号或发生超时?wait
似乎没有返回任何值。Condition Objects上的 python 文档对此没有提供任何线索。
我有 thread1 正在等待来自 thread2 的条件。但可能是 thread2 从来没有发出条件变量的信号。所以我wait
在线程 1 的调用中添加了超时,如下所示:
cv.acquire()
cv.wait(1.0)
cv.release()
我如何知道条件变量是否已发出信号或发生超时?wait
似乎没有返回任何值。Condition Objects上的 python 文档对此没有提供任何线索。
Martijn 的回答对于旧版本的 Python 是正确的,但是在 3.2 中,情况发生了变化。该方法wait()
现在False
在超时时返回。
有趣的是,现在也有一种wait_for()
方法。这需要一个谓词方法,并等待它评估为True
。超时后,它返回 False。
你不应该关心;典型的情况是您的等待线程检查某个共享状态,直到该状态与某个条件匹配。
因此,文档示例如下:
cv.acquire()
while not an_item_is_available():
cv.wait()
get_an_available_item()
cv.release()
该文件还指出:
[…] 对特定状态变化感兴趣的线程重复调用 wait() 直到他们看到所需的状态
如果您确实迫切需要区分超时和信号,则需要使用Event
对象来代替;如果未设置标志(仅在达到超时时发生),则对对象的.wait(timeout)
调用Event
返回。None