我正在寻找Java的tryAcquire Semaphore函数的python替代品。我发现这个函数是在python版本3及之后添加的。我使用的是python版本2.6.5。我有什么选择吗?我这里唯一的东西是semaphore.acquire(blocking = False) 这是我在Java中的代码 - (信号量发布正在另一个代码我没有包含的线程中完成)
if(Sem.tryAcquire(30, TimeUnit.SECONDS))
log.info("testCall Semaphore acquired ");
else
log.error("Semaphore Timeout occured");
答案 0 :(得分:1)
Semaphore
在纯Python中实现 - 请参阅http://hg.python.org/cpython/file/3.3/Lib/threading.py,从第236行开始。acquire
方法以这种方式实现:
def acquire(self, blocking=True, timeout=None):
if not blocking and timeout is not None:
raise ValueError("can't specify timeout for non-blocking acquire")
rc = False
endtime = None
with self._cond:
while self._value == 0:
if not blocking:
break
if timeout is not None:
if endtime is None:
endtime = _time() + timeout
else:
timeout = endtime - _time()
if timeout <= 0:
break
self._cond.wait(timeout)
else:
self._value = self._value - 1
rc = True
return rc
您可以直接在代码中使用Semaphore
的技术而不是使用类,但将整个类复制到您自己的代码中可能会更容易。如果前向兼容性是个问题,你甚至可以这样做:
from threading import *
from sys import version_info
if version_info < (3, 2):
# Need timeout in Semaphore.acquire,
# from Python 3.3 threading.py
class Semaphore:
...
无论您采用哪种方式,根据Condition
的文档
Condition.wait
课程。
除非给定超时到期,否则返回值为
True
,在这种情况下 它是False
。在版本3.2中更改:以前,该方法始终返回
None
。
Semaphore
超时代码依赖于此行为。兔子洞似乎没有比这更深,但是,你最简单的解决方案甚至可能是复制整个3.3 threading.py
,进行2需要运行的任何更改。 x,并在顶部添加一个突出的注释,表示你故意隐藏stdlib。