I am using a Python 3 sequence like this:
lock = threading.Lock()
res = lock.acquire(timeout=10)
if res:
# do something ....
lock.release()
else:
# do something else ...
I would prefer to use a with-statement instead of explicit "acquire" and "release", but I don't know how to get the timeout effect.
You can do this pretty easily with a context manager:
import threading
from contextlib import contextmanager
@contextmanager
def acquire_timeout(lock, timeout):
result = lock.acquire(timeout=timeout)
yield result
if result:
lock.release()
# Usage:
lock = threading.Lock()
with acquire_timeout(lock, 2) as acquired:
if acquired:
print('got the lock')
# do something ....
else:
print('timeout: lock not available')
# do something else ...
*Note: This won't work in Python 2.x since there isn't a timeout
argument to Lock.acquire