Python中的互斥锁装饰器

2 投票
2 回答
4248 浏览
提问于 2025-04-16 11:37

我在寻找给现有代码添加一些文件写入锁定的解决方案时,看到了这个链接: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

撰写回答