Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python condition variable timeout

I have thread1 which is waiting on a condition from thread2. But it could be that thread2 is never signalling the condition variable. So I have added a timeout to the wait call in thread 1, like this:

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

How can I know if the condition variable was signaled or a timeout occurred? wait does not seem to return any value. The python documentation on Condition Objects gives no clues about this.

like image 907
blueFast Avatar asked Jul 09 '12 08:07

blueFast


2 Answers

You are not supposed to care; the typical case is that your waiting thread checks some shared state until that state matches some condition.

The documentation example is thus:

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

and the documentation also states:

[…] threads that are interested in a particular change of state call wait() repeatedly until they see the desired state

If you do have a pressing need to distinguish between a timeout and a signal, you'll need to use Event objects instead; the .wait(timeout) call on an Event object returns None if the flag wasn't set (which only happens when the timeout was reached).

like image 111
Martijn Pieters Avatar answered Oct 05 '22 11:10

Martijn Pieters


Martijn's answer was true for older versions of Python, however in 3.2, this changed. The method wait() now returns False on timeout.

Interestingly, there is now a wait_for() method as well. This takes a predicate method, and waits for it to evaluate to True. Upon timing out, it returns False.

like image 30
ergosys Avatar answered Oct 05 '22 10:10

ergosys