python lock with语句和超时

新手上路,请多包涵

我正在使用这样的 Python 3 序列:

 lock = threading.Lock()
res = lock.acquire(timeout=10)
if res:
    # do something ....
    lock.release()
else:
    # do something else ...

我宁愿使用 with-statement 而不是显式的“acquire”和“release”,但我不知道如何获得超时效果。

原文由 Tsf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 617
1 个回答

您可以使用上下文管理器轻松完成此操作:

 import threading
from contextlib import contextmanager

@contextmanager
def acquire_timeout(lock, timeout):
    result = lock.acquire(timeout=timeout)
    try:
        yield result
    finally:
        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 ...

* 注意:这在 Python 2.x 中不起作用,因为没有 timeout 参数 Lock.acquire

原文由 robbles 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进