我的资源可以按R1
类型进行,该类型需要锁定或类型为R2
不需要:
class MyClass(object): # broken
def __init__ (self, ...):
if ...:
self.resource = R1(...)
self.lock = threading.Lock()
else:
self.resource = R2(...)
self.lock = None
def foo(self): # there are many locking methods
with self.lock:
operate(self.resource)
如果self.lock
是{
if
:
threading.Lock
始终将self.lock
设置为threading.Lock
with self.lock
似乎相对昂贵
(相当于磁盘i/o!)在定义一个普通锁类:
class TrivialLock(object):
def __enter__(self): pass
def __exit__(self, _a, _b, _c): pass
def acquire(self): pass
def release(self): pass
并用它代替None
表示R2
。在
TrivialLock
TrivialLock
?(我其实以为这样的事情会
在标准库中…)write
符合预期?在
我会定义
TrivialLock
。不过,这可能更为简单,因为您只需要一个上下文管理器,而不是一个锁。在您可以使用
^{pr2}$contextlib
使其更加简单:而且由于
yield
可以是一个表达式,所以可以用内联定义TrivalLock
:注意括号;
lambda: yield
无效。但是,生成器表达式(yield)
使其成为一个一次性上下文管理器;如果您试图在第二个with
语句中使用相同的值,则会出现Runtime
错误,因为generator
已用尽。在相关问题 更多 >
编程相关推荐