Python Conditionnelle “Avec” Lock Design
Question rapide, j'espère...
Je suis en train de faire certains de verrouillage à l'aide des déclarations
def someMethod(self, hasLock = False):
with self.my_lock:
self.somethingElse(hasLock=True)
def somethingElse(self, hasLock = False):
#I want this to be conditional...
with self.my_lock:
print 'i hate hello worlds"
Qui ont du sens? En gros, je veux seulement faire avec des SI* je n'ai pas encore de la serrure..
En plus d'être en mesure d'accomplir ceci, est-ce une mauvaise conception? Dois-je simplement acquérir/me libérer?
Cela semble être un de ces pet cerveau questions..
Il a une certaine odeur de code.
Pas plus, je vais utiliser RLock
Pas plus, je vais utiliser RLock
OriginalL'auteur Nix | 2011-03-03
Vous devez vous connecter pour publier un commentaire.
Il suffit d'utiliser un
threading.RLock
qui est ré-entrant sens qu'il peut être acquis plusieurs fois par le même thread.http://docs.python.org/library/threading.html#rlock-objects
Pour plus de clarté, le
RLock
est utilisé dans lewith
états, tout comme dans votre exemple de code:Quant à savoir si ou non il s'agit d'une mauvaise conception, nous aurions besoin de plus de contexte. Pourquoi les deux fonctions doivent acquérir le verrou? Quand est
func2
appelé par autre chose quefunc1
?Tant pis, cela fonctionne parfaitement. Merci.
des objets fournis par ce module, qui ont acquire() et release() méthodes peuvent être utilisées en tant que gestionnaires de contexte pour une instruction.”
OriginalL'auteur
Le Python
or
est le court-circuit de sorte que vous pouvez faire le verrouillage conditionnelle:Malheureusement il n'est pas si facile, car une valeur de type boolean n'est pas de retour valable à partir d'un
with
déclaration. Vous aurez besoin de créer une classe avec le__enter__
et__exit__
pour envelopper le booléenTrue
valeur.Voici une implémentation possible que je n'ai pas testé.
C'est beaucoup de passe-partout pour quelque chose de si simple, de sorte que le RLock solution ressemble à un gagnant. Cette solution pourrait être utile dans un contexte différent.
Je pense que cela fonctionnerait, mais RLock fait ce que j'ai besoin de sortir de la boîte. Merci.
merci, je l'avais oublié, contextmanager. Malheureusement, je ne pense pas que cela fonctionnerait dans ce contexte, puisque vous voulez seulement pour envelopper la valeur Vraie, pas la Fausse.
OriginalL'auteur
Pourquoi pas:
Note que bien que
someMethod
etsomethingElse
sont identiques dans ma solution, en général, ils seraient différentes. Vous pouvez placer un autre wrapper autour desomethingNoLock
de sorte que la serrure d'acquisition et de distribution n'est pas répétée plusieurs fois.C'est beaucoup plus simple et directe. Tout simplement parce que le réentrant de verrouillage marteau est disponible, je ne vous recommande pas de l'utiliser quand il n'y est plus simple, moins fragile moyen d'un clou.
Le plus spécifique de la critique de rlock est que la ligne qui crée le réentrant de verrouillage est loin de le code qui est de l'acquisition du verrou dans une ré-entrant. C'est un peu fragile, si quelqu'un dire fusionne les ré-entrant serrure avec un autre verrou qui n'est pas ré-entrant ou, sinon, les modifications de la ligne qui crée la serrure.
OriginalL'auteur
Avec l'aide de déclaration est mieux que de simplement
acquire()
etrelease()
fonctions. De cette façon, si une erreur se produit, le verrouillage est libéré.Vous ne pouvez pas faire les instructions conditionnelles, mais certains objets en charge affectation par instruction. Par exemple
with open("x.txt") as f: print f.read()
OriginalL'auteur
L'instruction est un excellent moyen de mettre en œuvre de verrouillage, verrouillage est une parfaite acquisition des ressources patron. Cependant, votre exemple ne fonctionne pas, vous aurez besoin d'une instruction if autour de l'instruction au sein de somethingElse().
OriginalL'auteur