Python中的互斥锁装饰器
我在寻找给现有代码添加一些文件写入锁定的解决方案时,看到了这个链接:http://yukelzon.blogspot.com/2005/07/python-locks.html。
为了满足我的需求,我简化后的版本看起来是这样的:
def mlock(orig):
def inner(*args, **kwargs):
Coloring.lock.acquire()
try:
ret = orig(*args, **kwargs)
return ret
finally:
Coloring.lock.release()
return inner
这个锁是一个类变量。有没有人能想到改进的方法或者更好的方式呢?
2 个回答
0
我不太喜欢使用自由变量。我可能会把锁定机制作为装饰器的一个明确变量,像这样:
def mlock(Coloring):
def mlock_decorator(orig):
def inner(*args, **kwargs):
Coloring.lock.acquire()
try:
ret = orig(*args, **kwargs)
return ret
finally:
Coloring.lock.release()
return inner
return mlock_decorator
嗯,因为Coloring
是一个类变量,如果你希望这个变量只和这个类相关,那就明确地访问它:
def mlock(orig):
def inner(self, *args, **kwargs):
self.Coloring.lock.acquire()
try:
ret = orig(self, *args, **kwargs)
return ret
finally:
self.Coloring.lock.release()
return inner
或者,至少要声明这个锁是一个全局变量。
def mlock(orig):
global Coloring
def inner(*args, **kwargs):
Coloring.lock.acquire()
try:
ret = orig(*args, **kwargs)
return ret
finally:
Coloring.lock.release()
return inner
3
如果你在使用 Python 2.6 及以上版本(我记得是这样),那么互斥锁对象可以作为上下文管理器使用,也就是说:
def mlock(f):
def inner(*args, **kwargs):
with Coloring.lock:
return f(*args, **kwargs)
return inner