Python2.6.5:是否有Java Semaphore tryAcquire的python等价物

时间:2013-06-17 08:41:53

标签: python multithreading semaphore blocking

我正在寻找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");

1 个答案:

答案 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

self._condCondition包裹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课程。
  

除非给定超时到期,否则返回值为True,在这种情况下   它是False

     

在版本3.2中更改:以前,该方法始终返回None

Semaphore超时代码依赖于此行为。兔子洞似乎没有比这更深,但是,你最简单的解决方案甚至可能是复制整个3.3 threading.py,进行2需要运行的任何更改。 x,并在顶部添加一个突出的注释,表示你故意隐藏stdlib。