python中的互斥修饰符

python中的互斥修饰符,python,locking,coding-style,mutex,decorator,Python,Locking,Coding Style,Mutex,Decorator,我看到了这一点:在寻找一种解决方案,在写入文件时向现有代码添加一些锁定 我需要的简化版本如下所示: def mlock(orig): def inner(*args, **kwargs): Coloring.lock.acquire() try: ret = orig(*args, **kwargs) return ret finally: Coloring.lock.release() re

我看到了这一点:在寻找一种解决方案,在写入文件时向现有代码添加一些锁定

我需要的简化版本如下所示:

  def mlock(orig):
    def inner(*args, **kwargs):
      Coloring.lock.acquire()
      try:
        ret = orig(*args, **kwargs)
        return ret
      finally:
        Coloring.lock.release()
    return inner

锁是一个类变量。有人能想出改进或更好的方法吗?

如果您使用的是Python 2.6+(我认为),互斥对象是上下文管理器,因此:

def mlock(f):
    def inner(*args, **kwargs):
        with Coloring.lock:
            return f(*args, **kwargs)
    return inner

我不喜欢自由变量。我可能会将锁作为装饰器的显式变量,如下所示:

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
因为
着色
是一个类变量,如果您希望它非常特定于该类,请显式访问它:

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

访问锁的方案,无论是全局的还是给定的,都没有“正确的方法”,只是根据需要有不同的方法。回答的版本在功能上与python wiki上的半官方版本相同,也值得一看: