Python条件"有"锁设计

Nix*_*Nix 18 python locking with-statement

快速提问,希望......

我正在尝试使用with语句进行一些共享锁定

def someMethod(self, hasLock = False):
     with self.my_lock:
         self.somethingElse(hasLock=True)


def somethingElse(self, hasLock = False):
    #I want this to be conditional...
    with self.my_lock:
          print 'i hate hello worlds"
Run Code Online (Sandbox Code Playgroud)

有道理?我基本上只想做IF*我还没有锁..

除了能够实现这一点,它是一个糟糕的设计?我应该自己获得/释放吗?

这似乎是那些脑屁问题之一..

Fog*_*ird 41

只需使用一个threading.RLock可重入的意思,它可以被同一个线程多次获取.

http://docs.python.org/library/threading.html#rlock-objects

为清楚起见,RLockwith语句中使用它,就像在示例代码中一样:

lock = threading.RLock()

def func1():
    with lock:
        func2()

def func2():
    with lock: # this does not block even though the lock is acquired already
        print 'hello world'
Run Code Online (Sandbox Code Playgroud)

至于这是否是糟糕的设计,我们需要更多的背景.为什么两个函数都需要获取锁?什么时候被func2其他人称呼func1

  • @Nix “该模块提供的所有具有获取()和释放()方法的对象都可以用作 with 语句的上下文管理器。” (2认同)

Mar*_*som 5

Python的or短路这样就可以使锁定条件:

def somethingElse(self, hasLock = False):
    #I want this to be conditional...
    with hasLock or self.my_lock:
          print 'i hate hello worlds'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并不是那么容易,因为布尔值不是with语句的有效返回。你需要创建一个类__enter____exit__包裹布尔True值。

这是我尚未测试过的一种可能的实现。

from contextlib import contextmanager

@contextmanager
def withTrue():
    yield True

def withbool(condition):
    if condition:
        return withTrue()
    return False

def somethingElse(self, hasLock = False):
    with withbool(hasLock) or self.my_lock():
          print 'i hate hello worlds'
Run Code Online (Sandbox Code Playgroud)

对于这么简单的事情,这是很多样板,因此RLock解决方案看起来像一个赢家。但是,此解决方案可能在其他情况下很有用。

  • 我认为这可以工作,但是RLock可以满足我的需要。谢谢。 (2认同)