2017-10-09 89 views
0

我正在将threading.RLock用于多线程应用程序。我想让线程尝试获得一个锁,如果不成功,重试次数会超过某个超时阈值。如何在Python中获取锁定时正确地尝试/捕获超时错误3.4

这里就是我有

>>> 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似乎很奇怪 - 我们不应该看到某种超时错误?

我在这里的问题是:

  1. 上午我在Python 3.4正确地这样做呢?我一直在寻找似乎针对Python 2.7的similar question asked on SO。此外,我有些困惑,为什么如果lock.acquire接受超时参数,我需要使用条件变量。
  2. 有没有更好的模式重试lock.acquire与重试之间的超时/延迟?

回答

0

锁是上下文管理器,但acquire不返回上下文管理。如果超时,它也不会抛出异常。

Lock.acquireRLock.acquire返回True如果他们获得锁定,并且如果他们没有获得锁定,则返回False。要测试您是否获得了锁定,只需检查返回值。请勿使用withtry - except

+0

啊!这是有道理的,为什么我得到的属性错误 - 这不是一个上下文管理器 - 谢谢!我想知道你是否也能够澄清关于链接问题的混淆。我应该使用条件变量吗? – user138440

+0

@ user138440:您不需要条件变量。链接的问题需要模拟'timeout',因为'Lock.acquire'和'RLock.acquire'不支持Python 2上的'timeout'。 – user2357112

相关问题