我的资源可以是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
为None
,则上述情况显然会失败。
if
:
def foo(self):
if self.lock:
with self.lock:
operate(self.resource)
else:
operate(self.resource)
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
是否符合预期?答案 0 :(得分:1)
我会定义TrivialLock
。但是,它可能更加微不足道,因为您只需要一个上下文管理器,而不是锁定。
class TrivialLock(object):
def __enter__(self):
pass
def __exit__(*args):
pass
使用contextlib
:
import contextlib
@contextlib.contextmanager
def TrivialLock():
yield
self.lock = TrivialLock()
由于yield
可以是表达式,因此您可以定义内联TrivalLock
:
self.lock = contextlib.contextmanager(lambda: (yield))()
请注意括号; lambda: yield
无效。但是,生成器表达式(yield)
使它成为一次性上下文管理器;如果您尝试在第二个with
语句中使用相同的值,则会出现Runtime
错误,因为generator
已用尽。