Aujourd'hui est le 24ème article Thème Python , se parler dans la même partie de nombreux flux - LOCK .
Si vous avez appris le système d'exploitation, il ne sera pas familier avec la clé. La signification de la clé est la serrure de flux, qui peut être utilisée pour spécifier la logique ou les ressources ne peut avoir qu'un accès de fil . C'est très bien, il semble qu'il y ait une pièce verrouillée par une serrure, et seuls ceux avec la clé peuvent entrer. Tout le monde a pris la clé de la porte de la pièce pour entrer dans la pièce. Lorsque vous sortez, vous mettrez la clé à la porte. Cela prendra la clé de la personne suivante à la porte. La pièce suivante est une ressource certaine ou logique, et ceux qui prennent la clé sont vraiment un sujet.
Premièrement, la raison
Nous comprenons le principe de la clé, je ne peux pas m'empêcher de ne pas avoir de problèmes, pourquoi devons-nous vous verrouiller, quelles scènes seront utilisées? En fait, son utilisation de scripts très larges, nous allons fournir une tombeT Exemple est très simple, ce qui signifie taobao acheter des articles. Nous savons tous que cet inventaire des entreprises est limité, vendant un peu moins. Si seulement l'un des stocks d'inventaire actuels, il y a deux acheteurs en même temps. Deux acheteurs en même temps, il existe deux demandes de démarrer une demande d'achat. Si nous ne verrouillons pas, deux flux de requête en stock sont 1, supérieur à 0, après avoir acheté la logique, tout en minimisant un. Parce que deux flux sont exécutés simultanément, l'inventaire du dernier élément deviendra -1.
Il est clair que le stock de marchandises ne devrait pas être un nombre négatif, nous devons donc éviter cela. Ce problème peut être résolu parfaitement par
. Nous spécifions qu'un seul thread peut commencer à demander l'achat, puis lorsqu'un fil est tombé à 0, la deuxième requête ne peut pas être modifiée et la précision des données est garantie.Deuxièmement, la mise en œuvre du code
ainsi en Python, comment pouvons-nous faire ce cours? DuperLa réalité, c'est très simple. Bibliothèque Luong nous a fourni l'outil thématique. Nous pouvons l'utiliser directement. En utilisant des objets de verrouillage entre chaînes, nous pouvons facilement verrouiller la fonction.
import threadingclass PurchaseRequest: ''' 初始化库存与锁 ''' def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.Lock() def incr(self,delta=1): ''' 加库存 ''' self._lock.acquire() self._value += delta self._lock.release() def decr(self,delta=1): ''' 减库存 ''' self._lock.acquire() self._value -= delta self._lock.release()
Nous pouvons facilement voir comment cet objet est facile à voir du code. Nous entrons dans les zones de verrouillage
(saisie de ressources) avant de devoir prendre la serrure à l'aide de la méthode serrure.acquire () d'abord. L'objet de verrouillage peut s'assurer qu'un seul flux peut être disponible pour obtenir la clé en même temps et seule la clé se poursuivra jusqu'à ce que la touche soit obtenue. Lorsque nous finissons, nous devons verrouiller la porte du verrouillage. », Donc, j'ai donc besoin d'appeler la méthode de sortie, indiquant la libération de la serrure.
Il y a un petit problème de programmateur est toujoursoublié Libération conduisant à des erreurs inutiles, et cette erreur dans cette scène de distribution est difficile à trouver le test. Parce qu'il est souvent difficile de vérifier et d'envoyer une scène lorsqu'il est testé, évaluéLe code est également facilement ignoré, donc une fois que cela sera révélé, il est difficile de trouver. Pour résoudre ce problème, la serrure fournit une utilisation améliorée, qui est utilisée avec la commande
. Avec la commande, nous avons utilisé le fichier avant les fichiers d'historique, l'utilisation avec nous peut compléter le travail de Essais de pêche et ressources de recyclage pour nous. Nous l'utilisons que. C'est la même chose. Après utilisation avec, nous pouvons écrire du code et libérer directement, de sorte que le code ci-dessus puisse être réécrit. Au fait:
Cela semble être un rafraîchissant?
import threadingclass PurchaseRequest: ''' 初始化库存与锁 ''' def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.Lock() def incr(self,delta=1): ''' 加库存 ''' with self._lock: self._value += delta def decr(self,delta=1): ''' 减库存 ''' with self._lock: self._value -= delta
Mardi, le verrouillage réutilisable n'est que la clé la plus simple, nous utilisons souvent
peut être capable de réutiliser. Est-ce un dos verrouillé? Expliquez simplement, il se situe dans un ruisseau qui a été fermé, il peut être ajouté. Zone de verrouillage. Mais comme le sujet conserve également une clé, il n'est plus dans la zone de verrouillage, comment peut-il y avoir une situation dedans?Zone nécessaire à nouveau? En fait, c'est très simple, c'est très simple.
Nous avons changé l'exemple sur un peu, c'était complètement différent.
Nous faisons attention à la méthode de la principale dent, nous avons utilisé le lien pour remplacer la logique d'origine pour effectuer Deard. Mais il y a un problème de décision qui est également une méthode de verrouillage. Besoin de le libérer avant que cela ne soit libéré. Mais il a été verrouillé, puis dans le cas de
verrouillage mort
. Nous devons simplement modifier la clé de la serrure réutilisable, vous pouvez résoudre ce problème, modifier simplement une ligne de code.import threadingclass PurchaseRequest: ''' 初始化库存与锁 ''' def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.Lock() def incr(self,delta=1): ''' 加库存 ''' with self._lock: self._value += delta def decr(self,delta=1): ''' 减库存 ''' with self._lock: self.incr(-delta)
Résumé
Aujourd'hui, notre article introduit l'utilisation de la serrure dans Python et le concept de verrouillage réutilisable. Développement et fonctionnement dans les scènes et est un travail plus difficile, un peu inconsciemment avec de nombreux trous différents, l'impasse n'est que l'une des thèmes les plus populaires et relativement faciles à résoudreimport threadingclass PurchaseRequest: ''' 初始化库存与锁 我们使用RLock代替了Lock,也可重入锁代替了普通锁 ''' def __init__(self, initial_value = 0): self._value = initial_value self._lock = threading.RLock() def incr(self,delta=1): ''' 加库存 ''' with self._lock: self._value += delta def decr(self,delta=1): ''' 减库存 ''' with self._lock: self.incr(-delta)
Plus d'autres problèmes.En raison du problème de l'impasse, Python a également fourni d'autres solutions, nous la partagerons avec vous à l'article suivant.