Python2.6.5:有没有python等价的Java信号量tryAcqui

2024-05-21 00:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Java的tryAcquire信号量函数寻找python替代品。我发现这个函数是在pythonversion3及之后添加的。我使用的是python版本2.6.5。我还有别的选择吗?我只有一件事信号量.acquire(阻塞=错误) 这是我用Java编写的代码(信号量的发布是在另一个线程中完成的,我没有包括它的代码)

if(Sem.tryAcquire(30, TimeUnit.SECONDS))   
   log.info("testCall Semaphore acquired ");
else 
   log.error("Semaphore Timeout occured");

Tags: 函数代码版本log替代品if错误java
1条回答
网友
1楼 · 发布于 2024-05-21 00:32:11

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的技术,而不是使用该类,但是将整个类复制到您自己的代码中可能会更容易一些。如果前向兼容性是一个问题,您甚至可以这样处理它:

^{pr2}$

无论采用哪种方法,都需要新的Condition类——根据Condition.wait的文档

The return value is True unless a given timeout expired, in which case it is False.

Changed in version 3.2: Previously, the method always returned None.

Semaphore超时代码依赖于此行为。兔子洞似乎没有比这更深入,但是,最简单的解决方案可能是复制整个3.3threading.py,对它在2.x上运行所需的任何更改进行修改,并在顶部添加一个显著的注释,说明您有意隐藏stdlib。在

相关问题 更多 >