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
为清楚起见,RLock在with语句中使用它,就像在示例代码中一样:
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?
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解决方案看起来像一个赢家。但是,此解决方案可能在其他情况下很有用。
| 归档时间: |
|
| 查看次数: |
46209 次 |
| 最近记录: |