我正在使用threading.RLock
作为多线程应用程序。我想让线程尝试获取锁,如果不成功,请重试一些次数,前提是重试的时间低于某个超时阈值。
这就是我所拥有的
>>> import threading
>>> lock = threading.RLock()
>>> def worker():
with lock.acquire(timeout=5):
print('acquired')
>>> lock.acquire()
>>> t2 = threading.Thread(target=worker)
>>> t2.start()
这似乎有效,等待五秒后我得到一个例外:
>>> Exception in thread Thread-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 920, in _bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 868, in run
self._target(*self._args, **self._kwargs)
File "<pyshell#7>", line 2, in test
AttributeError: __exit__
KeyboardInterrupt
>>>
KeyboardInterrupt
AttributeError
似乎很奇怪 - 我们不应该看到某种超时错误吗?
我的问题是:
lock.acquire
接受超时参数,我需要使用条件变量。lock.acquire
是否有更好的模式?答案 0 :(得分:0)
锁是上下文管理器,但drop
没有返回上下文管理器。如果它超时,它也不会抛出异常。
acquire
和Lock.acquire
如果获得锁定则返回RLock.acquire
,如果他们没有,则返回True
。要测试是否获得了锁定,只需检查返回值。请勿使用False
或with
- try
。