- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在寻找 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");
最佳答案
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
self._cond
是 Condition包装Lock 。
您可以直接在代码中使用 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
的文档,
The return value is
True
unless a given timeout expired, in which case it isFalse
.Changed in version 3.2: Previously, the method always returned
None
.
Semaphore
超时代码依赖于此行为。兔子洞似乎并没有比这更深,但是,最简单的解决方案甚至可能是复制整个 3.3 threading.py
,进行所需的任何更改在 2.x 上运行,并在顶部添加一个显着的注释,表明您故意隐藏 stdlib。
关于Python2.6.5 : Is there python equivalent of Java Semaphore tryAcquire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17143516/
我是一名优秀的程序员,十分优秀!