Verrouillage de fil Python

Verrouillage de fil Python
Dans Python, il y a deux états de verrouillage: verrouillé et déverrouillé. Le verrou est la classe de la bibliothèque de filetage Python. Nous avons juste besoin d'importer le verrou en utilisant le verrou dans le threading. La première procédure pour le verrou est «acquérir ()» et la deuxième approche est «release ()». Dans Python, les serrures sont la primitive de synchronisation la plus élémentaire.

Exemple # 1: Exécution du script de thread Python Utilisation du délai d'attente dans Acquire () Lock.

Nous discuterons de l'utilisation de la méthode «acquérir ()» de la serrure dans cet exemple. La méthode «Acquire ()» peut être utilisée pour verrouiller. Aucun plus d'efforts ne peut être faits pour y parvenir jusqu'à ce que le verrou a été libéré une fois qu'un fil a verrouillé le verrouillage. La méthode «Acquire ()» peut être utilisée pour sécuriser un verrouillage. Une fois qu'un thread a obtenu la serrure, aucune autre tentative ne peut être faite pour le faire jusqu'à ce que la serrure soit libérée. L'option «Timeout» sera également utilisée dans ce cas de la méthode «acquérir ()» pour spécifier combien de temps le thread d'appel sera retardé si une autre opération tente déjà d'obtenir le verrouillage. Si la valeur potentielle du thread est de 1, ce qui est 1, le thread sera retardé indéfiniment jusqu'à ce qu'il acquiert la serrure. Ici, nous l'avons utilisé pour déterminer combien de temps un fil recherchera un verrouillage.

Commençons par implémenter le script à l'aide de l'outil "Spyder" pour implémenter le code. Nous allons d'abord importer le verrouillage et le thread de la bibliothèque de filetage Python. Les threads sont utilisés dans un processus Python pour effectuer l'exécution du code. Chaque programme a un thread par défaut, mais nous pourrions avoir besoin de produire plus de threads si nous voulons faire plusieurs processus simultanément. Le module de sommeil est ensuite importé. La méthode «Sleep ()» dans le module de temps de Python est utilisée pour suspendre l'exécution d'un programme pour un temps prédéterminé. Cela suggère que le programme est temporairement suspendu avant d'être exécuté automatiquement après une période prédéterminée. Ensuite, la méthode «Lock ()» est utilisée. Ensuite, dans la ligne suivante, nous définissons une fonction avec le nom «Func1» et passons la variable «verrouillage» dans ses parenthèses.

L'instruction «IF» permet l'exécution d'une déclaration ou d'un ensemble de déclarations dans des circonstances spécifiques en fonction de l'issue d'une expression. Nous utilisons la méthode «acquérir ()» sur l'objet de verrouillage à l'intérieur de la condition «If» afin que le thread attende continuellement le verrouillage. Nous passons un délai d'expiration comme l'un de ses paramètres et l'avons mis sur «10» dans les parenthèses de la fonction «acquérir ()». Maintenant, si l'instruction satisfait l'exigence, nous utilisons la fonction «print ()», passant l'instruction «Thread 2: Done» dans ses parenthèses, puis nous appelons la méthode Release () sur un module d'objet de verrouillage. Si la serrure est verrouillée, ce processus réagira après l'avoir levé à son état déverrouillé.

De plus, cette méthode peut être appelée par n'importe quel fil. Il est autorisé à l'un des fils qui attendent déjà d'acquérir la prise pour s'y accrocher jusqu'à ce que cette fonction soit appelée. Nous imprimons maintenant la déclaration «Thread 1: Timeout» si la condition n'est pas remplie. Nous allons maintenant construire une nouvelle fonction avec le nom «func» et le verrouillage des paramètres dans la ligne suivante. Ensuite, en utilisant l'objet Lock, nous exécutons la méthode «acquérir ()». Dans la ligne suivante, nous appelons ensuite la fonction «print ()» et fournissons l'instruction «Thread 1: Done» avant d'utiliser la méthode «release ()» avec le verrouillage.

Nous allons maintenant créer un thread et appeler les méthodes du thread en appelant l'objet thread. Nous avons utilisé un fil et défini «Target = Func» à l'intérieur, en passant l'argument «verrouillage»,. Ensuite, nous avons enregistré ce thread dans une variable appelée «Thread1."Dans la ligne suivante, nous avons appelé" Func1 "avec le fil et passé l'argument" Lock ", en utilisant" Thread1.start () ”pour démarrer le fil. Nous avons fait de même pour Thread2. La méthode «join ()» est ensuite utilisée pour attendre l'exécution du thread. Ainsi, nous avons deux threads, chacun appelant deux routines distinctes. Le délai d'expiration du deuxième thread est «10» secondes, tandis que le premier thread fonctionne pendant «2» secondes.

L'affichage de sortie montre maintenant que le thread 1 est effectué en premier depuis sa génération en premier et a pu accéder au verrou et terminer son exécution. Le thread 2 est terminé car le délai d'attente a été réglé sur «10» secondes, comme on peut le voir.

Exemple n ° 2: Utilisation du verrouillage du fil de Python dans une condition de course

Nous utiliserons le verrouillage du fil Python en état de course dans cet exemple. Une condition de course se produit lorsque deux threads regardent une variable partagée simultanément. Les threads initiaux et deuxième ont reçu le même résultat de la constante du thread d'origine. Ensuite, les deux threads tentent de modifier la valeur commune de la variable dépendante. Les données du thread qui s'ajoutent à la liste des variables partagées sont maintenues car elle efface la valeur que le thread précédent a écrit.

Commençons à implémenter le code. Dans la première ligne, nous importons le module de verrouillage du module de filetage. Et dans la ligne suivante, nous importons le module Time. Ensuite, nous créons une variable et lui donnons la valeur «20». Dans la ligne suivante, nous créons une fonction appelée «func1» et passons deux variables «incrément» et «verrouillage» comme paramètres. Nous créons une variable globale appelée «a» et la passons une serrure.

Enfin, dans la ligne suivante, nous créons une variable appelée «local_counter» et la passons dedans. La valeur de ce «compteur local» est incrémentée dans la ligne suivante en fonction de la fin du thread. Ensuite, nous appelons le «temps.Méthode sleep () ”et fournissez une période de« 0.5 ”secondes dans la ligne suivante. La méthode «print ()» est ensuite exécutée et le compteur local est enregistré dans la variable «A». Dans cette fonction, le thread actuel est appelé en utilisant «Threading.current_thread ().Les incréments de nom A par incrément »et transmettent le« A »dans lequel la valeur est stockée et la méthode« release () »avec verrouillage est appelée dans la ligne suivante. Dans la ligne suivante, nous passons la méthode Lock ().

Maintenant, nous allons créer deux threads et appeler la fonction en utilisant les threads. Nous appelons la fonction dans le premier thread en utilisant le threading.Thread, utilisé «Target = func1», et passez l'argument «15» comme incrément et «verrouillage». Nous avons stocké ce premier thread dans la variable «T1», puis nous répétons la même procédure pour le thread 2, mais nous passons l'argument qui est l'incrément de «5» et «verrouillage». Ensuite, nous utilisons «Thread.start () "pour démarrer le thread et" join () "pour attendre que le fil finisse en cours d'exécution. La valeur finale sera ensuite affichée.

Maintenant, le simple fait de mettre ce code fait lire les deux threads à lire la valeur que nous avons partagée. "T1" et "T2" tenteront de modifier la valeur de "A" dans la fonction d'incrément en utilisant les valeurs d'incrément "15" et "5" qui sont fournies dans le tuple du paramètre.

Maintenant, il affiche le résultat final «40» dans la sortie. Comme nous avons «A = 20» dans le code ci-dessus, lorsque «Thread 1» augmente de «15», le résultat est «35» et que la valeur passe à «35» cependant, lorsque «Thread 2» augmente de «5» Le résultat est «40».

Conclusion

La fonction de verrouillage de filetage Python qui a deux méthodes: acquire () et release () est couverte dans cet article. Deux exemples sont présentés dans ce guide. Dans le premier cas, nous avons utilisé un délai d'expiration dans un verrou acquire (), et dans le deuxième exemple, nous avons utilisé une condition de course en utilisant Python Lock () pour montrer comment cela a un impact sur le fonctionnement des threads. Nous prévoyons que vous trouverez ces cas utiles lorsque vous utilisez des verrous de fil Python.