2 votes

décorateur mutex en python

J'ai vu ça : http://yukelzon.blogspot.com/2005/07/python-locks.html à la recherche d'une solution pour ajouter un verrouillage au code existant autour de l'écriture dans un fichier.

La version simplifiée pour mes besoins ressemble à ceci :

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

Le verrou est une variable de classe. Quelqu'un peut-il penser à des améliorations ou à de meilleures méthodes ?

3voto

Si vous utilisez Python 2.6+ (je pense), les objets mutex sont des gestionnaires de contexte, donc :

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

0voto

IfLoop Points 59461

Je ne suis pas un fan des variables libres. Je ferais probablement du verrou une variable explicite du décorateur, comme ceci :

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

Eh bien, puisque Coloring est une variable de classe, et si vous vous attendez à ce que cela soit assez spécifique à cette classe, accédez-y explicitement :

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

Ou, au moins, déclarer que le verrou est un verrou global.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X