Multithreading dans Python avec exemple : Apprenez GIL dans Python
Qu'est-ce qu'un fil ?
Un thread est une unitรฉ d'exรฉcution sur la programmation concurrente. Le multithreading est une technique qui permet ร un processeur d'exรฉcuter plusieurs tรขches d'un mรชme processus en mรชme temps. Ces threads peuvent s'exรฉcuter individuellement tout en partageant leurs ressources de processus.
Qu'est-ce qu'un processus ?
Un processus est essentiellement le programme en exรฉcution. Lorsque vous dรฉmarrez une application sur votre ordinateur (comme un navigateur ou un รฉditeur de texte), le systรจme d'exploitation crรฉe un processus.
Quโest-ce que le multithreading Python?
Multithreading dans Python la programmation est une technique bien connue dans laquelle plusieurs threads d'un processus partagent leur espace de donnรฉes avec le thread principal, ce qui rend le partage d'informations et la communication au sein des threads faciles et efficaces. Les fils sont plus lรฉgers que les processus. Plusieurs threads peuvent s'exรฉcuter individuellement tout en partageant leurs ressources de processus. Le but du multithreading est dโexรฉcuter plusieurs tรขches et cellules fonctionnelles en mรชme temps.
Quโest-ce que le multitraitement ?
Multitraitement vous permet dโexรฉcuter simultanรฉment plusieurs processus non liรฉs. Ces processus ne partagent pas leurs ressources et ne communiquent pas via IPC.
Python Multithreading vs multitraitement
Pour comprendre les processus et les threads, envisagez ce scรฉnario : Un fichier .exe sur votre ordinateur est un programme. Lorsque vous l'ouvrez, le systรจme d'exploitation le charge en mรฉmoire et le processeur l'exรฉcute. L'instance du programme en cours d'exรฉcution est appelรฉe le processus.
Chaque processus comportera 2 รฉlรฉments fondamentaux :
- Le code
- Les donnรฉes
Dรฉsormais, un processus peut contenir une ou plusieurs sous-parties appelรฉes threads. Cela dรฉpend de l'architecture du systรจme d'exploitation. Vous pouvez considรฉrer un thread comme une section du processus qui peut รชtre exรฉcutรฉe sรฉparรฉment par le systรจme d'exploitation.
En dโautres termes, il sโagit dโun flux dโinstructions qui peuvent รชtre exรฉcutรฉes indรฉpendamment par le systรจme dโexploitation. Les threads au sein d'un mรชme processus partagent les donnรฉes de ce processus et sont conรงus pour fonctionner ensemble pour faciliter le parallรฉlisme.
Pourquoi utiliser le multithreading ?
Le multithreading vous permet de dรฉcomposer une application en plusieurs sous-tรขches et d'exรฉcuter ces tรขches simultanรฉment. Si vous utilisez correctement le multithreading, la vitesse, les performances et le rendu de votre application peuvent tous รชtre amรฉliorรฉs.
Python MultiThreading
Python prend en charge les constructions pour le multitraitement et le multithreading. Dans ce didacticiel, vous vous concentrerez principalement sur la mise en ลuvre multithread applications avec Python. Il existe deux modules principaux qui peuvent รชtre utilisรฉs pour gรฉrer les threads dans Python:
- Le fil module, et
- Le filetage module
Cependant, en Python, il existe รฉgalement ce qu'on appelle un verrou d'interprรฉteur global (GIL). Cela ne permet pas beaucoup de gain de performances et peut mรชme rรฉduire les performances de certaines applications multithread. Vous apprendrez tout cela dans les prochaines sections de ce didacticiel.
Les modules Thread et Threading
Les deux modules que vous dรฉcouvrirez dans ce tutoriel sont les module de fil et de la module de filetage.
Cependant, le module thread est obsolรจte depuis longtemps. En commenรงant par Python 3, il a รฉtรฉ dรฉsignรฉ comme obsolรจte et n'est accessible que sous forme de __fil pour la compatibilitรฉ descendante.
Vous devriez utiliser le niveau supรฉrieur filetage module pour les applications que vous avez l'intention de dรฉployer. Le module de fil de discussion n'a รฉtรฉ abordรฉ ici qu'ร des fins รฉducatives.
Le module de fil de discussion
La syntaxe pour crรฉer un nouveau thread ร l'aide de ce module est la suivante :
thread.start_new_thread(function_name, arguments)
Trรจs bien, vous avez maintenant couvert la thรฉorie de base pour commencer ร coder. Alors, ouvrez votre IDLE ou un bloc-notes et tapez ce qui suit :
import time
import _thread
def thread_test(name, wait):
i = 0
while i <= 3:
time.sleep(wait)
print("Running %s\n" %name)
i = i + 1
print("%s has finished execution" %name)
if __name__ == "__main__":
_thread.start_new_thread(thread_test, ("First Thread", 1))
_thread.start_new_thread(thread_test, ("Second Thread", 2))
_thread.start_new_thread(thread_test, ("Third Thread", 3))
Enregistrez le fichier et appuyez sur F5 pour exรฉcuter le programme. Si tout a รฉtรฉ fait correctement, voici le rรฉsultat que vous devriez voir :
Vous en apprendrez davantage sur les conditions de course et comment les gรฉrer dans les sections ร venir.
EXPLICATION DES CODES
- Ces instructions importent le module time et thread qui sont utilisรฉs pour gรฉrer l'exรฉcution et le retardement du Python threads.
- Ici, vous avez dรฉfini une fonction appelรฉe fil_test, qui sera appelรฉ par le start_new_thread mรฉthode. La fonction exรฉcute une boucle while pendant quatre itรฉrations et imprime le nom du thread qui l'a appelรฉe. Une fois l'itรฉration terminรฉe, il imprime un message indiquant que le thread a terminรฉ son exรฉcution.
- Il s'agit de la section principale de votre programme. Ici, vous appelez simplement le start_new_thread mรฉthode avec le fil_test fonction comme argument. Cela crรฉera un nouveau thread pour la fonction que vous passez en argument et commencera ร lโexรฉcuter. Notez que vous pouvez remplacer ceci (thread_test) avec toute autre fonction que vous souhaitez exรฉcuter en tant que thread.
Le module de filetage
Ce module est l'implรฉmentation de haut niveau du threading en python et le standard de facto pour la gestion des applications multithread. Il offre un large รฉventail de fonctionnalitรฉs par rapport au module thread.

Voici une liste de quelques fonctions utiles dรฉfinies dans ce module :
| Nom de la fonction | Description |
|---|---|
| actifCount() | Renvoie le nombre de Fil ร coudre objets encore vivants |
| fil en cours() | Renvoie l'objet actuel de la classe Thread. |
| รฉnumรฉrer() | Rรฉpertorie tous les objets Thread actifs. |
| estDรฉmon() | Renvoie vrai si le thread est un dรฉmon. |
| est vivant() | Renvoie vrai si le thread est toujours actif. |
| Mรฉthodes de classe de thread | |
| dรฉmarrer() | Dรฉmarre l'activitรฉ d'un fil. Il ne doit รชtre appelรฉ qu'une seule fois pour chaque thread car il gรฉnรฉrera une erreur d'exรฉcution s'il est appelรฉ plusieurs fois. |
| Cours() | Cette mรฉthode dรฉnote l'activitรฉ d'un thread et peut รชtre remplacรฉe par une classe qui รฉtend la classe Thread. |
| joindre() | Il bloque l'exรฉcution d'autres codes jusqu'ร ce que le thread sur lequel la mรฉthode join() a รฉtรฉ appelรฉe soit terminรฉ. |
Histoire : la classe Thread
Avant de commencer ร coder des programmes multithread ร l'aide du module threading, il est crucial de comprendre la classe Thread. La classe thread est la classe principale qui dรฉfinit le modรจle et les opรฉrations d'un thread en python.
La maniรจre la plus courante de crรฉer une application Python multithread consiste ร dรฉclarer une classe qui รฉtend la classe Thread et remplace sa mรฉthode run().
La classe Thread, en rรฉsumรฉ, signifie une sรฉquence de code qui s'exรฉcute dans un environnement distinct. fil de contrรดle.
Ainsi, lors de lโรฉcriture dโune application multithread, vous effectuerez les opรฉrations suivantes :
- dรฉfinir une classe qui รฉtend la classe Thread
- Remplacer le __init__ constructeur
- Remplacer le Cours() mรฉthode
Une fois qu'un objet thread a รฉtรฉ crรฉรฉ, le dรฉmarrer() mรฉthode peut รชtre utilisรฉe pour commencer lโexรฉcution de cette activitรฉ et la joindre() La mรฉthode peut รชtre utilisรฉe pour bloquer tous les autres codes jusqu'ร la fin de l'activitรฉ en cours.
Essayons maintenant d'utiliser le module threading pour implรฉmenter votre exemple prรฉcรฉdent. Encore une fois, allumez votre IDLE et saisissez ce qui suit :
import time
import threading
class threadtester (threading.Thread):
def __init__(self, id, name, i):
threading.Thread.__init__(self)
self.id = id
self.name = name
self.i = i
def run(self):
thread_test(self.name, self.i, 5)
print ("%s has finished execution " %self.name)
def thread_test(name, wait, i):
while i:
time.sleep(wait)
print ("Running %s \n" %name)
i = i - 1
if __name__=="__main__":
thread1 = threadtester(1, "First Thread", 1)
thread2 = threadtester(2, "Second Thread", 2)
thread3 = threadtester(3, "Third Thread", 3)
thread1.start()
thread2.start()
thread3.start()
thread1.join()
thread2.join()
thread3.join()
Ce sera le rรฉsultat lorsque vous exรฉcuterez le code ci-dessus :
EXPLICATION DES CODES
- Cette partie est la mรชme que notre exemple prรฉcรฉdent. Ici, vous importez le module time et thread qui sont utilisรฉs pour gรฉrer l'exรฉcution et les dรฉlais de l' Python threads.
- Dans ce bit, vous crรฉez une classe appelรฉe threadtester, qui hรฉrite ou รฉtend le Fil ร coudre classe du module de threading. C'est l'une des faรงons les plus courantes de crรฉer des threads en python. Cependant, vous ne devez remplacer que le constructeur et le Cours() mรฉthode dans votre application. Comme vous pouvez le voir dans l'exemple de code ci-dessus, le __init__ La mรฉthode (constructeur) a รฉtรฉ remplacรฉe. De mรชme, vous avez รฉgalement remplacรฉ le Cours() mรฉthode. Il contient le code que vous souhaitez exรฉcuter dans un thread. Dans cet exemple, vous avez appelรฉ la fonction thread_test().
- C'est la mรฉthode thread_test() qui prend la valeur de i comme argument, le diminue de 1 ร chaque itรฉration et parcourt le reste du code jusqu'ร ce que i devienne 0. ร chaque itรฉration, il imprime le nom du thread en cours d'exรฉcution et se met en veille pendant quelques secondes d'attente (ce qui est รฉgalement pris comme argument ).
- thread1 = threadtester(1, ยซ First Thread ยป, 1) Ici, nous crรฉons un thread et transmettons les trois paramรจtres que nous avons dรฉclarรฉs dans __init__. Le premier paramรจtre est l'identifiant du thread, le deuxiรจme paramรจtre est le nom du thread et le troisiรจme paramรจtre est le compteur, qui dรฉtermine combien de fois la boucle while doit รชtre exรฉcutรฉe.
- thread2.start()La mรฉthode start est utilisรฉe pour dรฉmarrer l'exรฉcution d'un thread. En interne, la fonction start() appelle la mรฉthode run() de votre classe.
- thread3.join() La mรฉthode join() bloque l'exรฉcution d'autres codes et attend la fin du thread sur lequel elle a รฉtรฉ appelรฉe.
Comme vous le savez dรฉjร , les threads qui sont dans le mรชme processus ont accรจs ร la mรฉmoire et aux donnรฉes de ce processus. Par consรฉquent, si plusieurs threads tentent de modifier ou dโaccรฉder aux donnรฉes simultanรฉment, des erreurs peuvent sโinfiltrer.
Dans la section suivante, vous verrez les diffรฉrents types de complications qui peuvent apparaรฎtre lorsque les threads accรจdent aux donnรฉes et ร la section critique sans vรฉrifier les transactions d'accรจs existantes.
Impasses et conditions de course
Avant d'en savoir plus sur les blocages et les conditions de concurrence, il sera utile de comprendre quelques dรฉfinitions de base liรฉes ร la programmation simultanรฉe :
- Section critiqueIl s'agit d'un fragment de code qui accรจde ou modifie les variables partagรฉes et doit รชtre effectuรฉ comme une transaction atomique.
- Changement de contexteC'est le processus qu'un processeur suit pour stocker l'รฉtat d'un thread avant de passer d'une tรขche ร une autre afin qu'il puisse รชtre repris au mรชme point plus tard.
Les impasses
Les impasses sont le problรจme le plus redoutรฉ auquel les dรฉveloppeurs sont confrontรฉs lors de l'รฉcriture d'applications simultanรฉes/multithread en python. La meilleure faรงon de comprendre les blocages est d'utiliser l'exemple de problรจme informatique classique connu sous le nom de La Cuisine PhiloProblรจme des Sophers.
Lโรฉnoncรฉ du problรจme pour les philosophes de la restauration est le suivant :
Cinq philosophes sont assis sur une table ronde avec cinq assiettes de spaghetti (un type de pรขtes) et cinq fourchettes, comme le montre le schรฉma.
ร un moment donnรฉ, un philosophe doit soit manger, soit rรฉflรฉchir.
De plus, un philosophe doit prendre les deux fourchettes adjacentes ร lui (c'est-ร -dire les fourchettes gauche et droite) avant de pouvoir manger les spaghettis. Le problรจme de lโimpasse survient lorsque les cinq philosophes prennent simultanรฉment leur bonne fourchette.
Puisque chacun des philosophes possรจde une fourchette, ils attendront tous que les autres posent leur fourchette. Rรฉsultat : aucun dโentre eux ne pourra manger des spaghettis.
De mรชme, dans un systรจme concurrent, un blocage se produit lorsque diffรฉrents threads ou processus (philosophes) tentent d'acquรฉrir les ressources systรจme partagรฉes (forks) en mรชme temps. En consรฉquence, aucun des processus nโa la possibilitรฉ de sโexรฉcuter car ils attendent une autre ressource dรฉtenue par un autre processus.
Conditions de course
Une condition de concurrence critique est un รฉtat indรฉsirable d'un programme qui se produit lorsqu'un systรจme exรฉcute deux ou plusieurs opรฉrations simultanรฉment. Par exemple, considรฉrons cette simple boucle for :
i=0; # a global variable
for x in range(100):
print(i)
i+=1;
Si vous crรฉez n nombre de threads qui exรฉcutent ce code ร la fois, vous ne pouvez pas dรฉterminer la valeur de i (qui est partagรฉe par les threads) lorsque le programme termine son exรฉcution. En effet, dans un environnement multithread rรฉel, les threads peuvent se chevaucher et la valeur de i qui a รฉtรฉ rรฉcupรฉrรฉe et modifiรฉe par un thread peut changer entre-temps lorsqu'un autre thread y accรจde.
Ce sont les deux principales classes de problรจmes pouvant survenir dans une application Python multithread ou distribuรฉe. Dans la section suivante, vous apprendrez comment surmonter ce problรจme en synchronisant les threads.
Syncfils de discussion
Pour gรฉrer les conditions de concurrence, les blocages et autres problรจmes liรฉs aux threads, le module de threading fournit le Verrouillage objet. L'idรฉe est que lorsqu'un thread souhaite accรฉder ร une ressource spรฉcifique, il acquiert un verrou pour cette ressource. Une fois qu'un thread verrouille une ressource particuliรจre, aucun autre thread ne peut y accรฉder jusqu'ร ce que le verrou soit libรฉrรฉ. En consรฉquence, les modifications apportรฉes ร la ressource seront atomiques et les conditions de concurrence seront รฉvitรฉes.
Un verrou est une primitive de synchronisation de bas niveau implรฉmentรฉe par le __fil module. ร tout moment, une serrure peut รชtre dans l'un des 2 รฉtats suivants : fermรฉ or dรฉverrouillรฉ. Il prend en charge deux mรฉthodes :
- acquรฉrir()Lorsque l'รฉtat de verrouillage est dรฉverrouillรฉ, l'appel de la mรฉthode acquire() changera l'รฉtat en verrouillรฉ et reviendra. Cependant, si l'รฉtat est verrouillรฉ, l'appel ร acquire() est bloquรฉ jusqu'ร ce que la mรฉthode release() soit appelรฉe par un autre thread.
- Libรฉration()La mรฉthode release() est utilisรฉe pour dรฉfinir l'รฉtat sur dรฉverrouillรฉ, c'est-ร -dire pour libรฉrer un verrou. Il peut รชtre appelรฉ par n'importe quel thread, pas nรฉcessairement celui qui a acquis le verrou.
Voici un exemple d'utilisation de verrous dans vos applications. Allumez votre IDLE et tapez ce qui suit :
import threading
lock = threading.Lock()
def first_function():
for i in range(5):
lock.acquire()
print ('lock acquired')
print ('Executing the first funcion')
lock.release()
def second_function():
for i in range(5):
lock.acquire()
print ('lock acquired')
print ('Executing the second funcion')
lock.release()
if __name__=="__main__":
thread_one = threading.Thread(target=first_function)
thread_two = threading.Thread(target=second_function)
thread_one.start()
thread_two.start()
thread_one.join()
thread_two.join()
Maintenant, appuyez sur F5. Vous devriez voir une sortie comme celle-ci :
EXPLICATION DES CODES
- Ici, vous crรฉez simplement un nouveau verrou en appelant le threading.Lock() fonction d'usine. En interne, Lock() renvoie une instance de la classe Lock concrรจte la plus efficace maintenue par la plate-forme.
- Dans la premiรจre instruction, vous obtenez le verrou en appelant la mรฉthode acquire(). Lorsque le verrouillage a รฉtรฉ accordรฉ, vous imprimez ยซ serrure acquise ยป ร la console. Une fois que tout le code que vous souhaitez que le thread exรฉcute est terminรฉ, vous libรฉrez le verrou en appelant la mรฉthode release().
La thรฉorie est bonne, mais comment savoir si la serrure a rรฉellement fonctionnรฉ ? Si vous regardez le rรฉsultat, vous verrez que chacune des instructions d'impression imprime exactement une ligne ร la fois. Rappelez-vous que, dans un exemple prรฉcรฉdent, les sorties de print รฉtaient alรฉatoires car plusieurs threads accรฉdaient ร la mรฉthode print() en mรชme temps. Ici, la fonction d'impression n'est appelรฉe qu'aprรจs l'acquisition du verrou. Ainsi, les sorties sont affichรฉes une par une et ligne par ligne.
Outre les verrous, Python prend รฉgalement en charge d'autres mรฉcanismes pour gรฉrer la synchronisation des threads, comme indiquรฉ ci-dessous :
- RLocks
- Semaphores
- Conditions
- รฉvรฉnements, et
- Barriรจres
Verrouillage global de l'interprรจte (et comment y faire face)
Avant d'entrer dans les dรฉtails du GIL de python, dรฉfinissons quelques termes qui seront utiles pour comprendre la section ร venir :
- Code liรฉ au CPU : il s'agit de tout morceau de code qui sera directement exรฉcutรฉ par le CPU.
- Code liรฉ aux E/S : il peut s'agir de n'importe quel code qui accรจde au systรจme de fichiers via le systรจme d'exploitation
- CPython: c'est la rรฉfรฉrence la mise en oeuvre of Python et peut รชtre dรฉcrit comme l'interprรฉteur รฉcrit en C et Python (langage de programmation).
Qu'est-ce que GIL dans Python?
Verrouillage d'interprรจte global (GIL) en python est un verrou de processus ou un mutex utilisรฉ lors du traitement des processus. Il garantit qu'un thread peut accรฉder ร une ressource particuliรจre ร la fois et empรชche รฉgalement l'utilisation simultanรฉe d'objets et de bytecodes. Cela profite aux programmes monothread en termes dโaugmentation des performances. GIL en python est trรจs simple et facile ร mettre en ลuvre.
Un verrou peut รชtre utilisรฉ pour garantir qu'un seul thread a accรจs ร une ressource particuliรจre ร un moment donnรฉ.
L'une des caractรฉristiques de Python c'est qu'il utilise un verrou global sur chaque processus d'interprรฉteur, ce qui signifie que chaque processus traite l'interprรฉteur Python lui-mรชme comme une ressource.
Par exemple, supposons que vous ayez รฉcrit un programme Python qui utilise deux threads pour effectuer ร la fois les opรฉrations CPU et ยซ E/S ยป. Lorsque vous exรฉcutez ce programme, voici ce qui se passe :
- L'interprรฉteur Python crรฉe un nouveau processus et gรฉnรจre les threads
- Lorsque le thread-1 dรฉmarre, il acquiert d'abord le GIL et le verrouille.
- Si le thread-2 veut s'exรฉcuter maintenant, il devra attendre que le GIL soit libรฉrรฉ mรชme si un autre processeur est libre.
- Supposons maintenant que le thread 1 attend une opรฉration dโE/S. ร ce moment-lร , il libรฉrera le GIL et le thread-2 l'acquรฉrira.
- Aprรจs avoir terminรฉ les opรฉrations d'E/S, si le thread-1 veut s'exรฉcuter maintenant, il devra ร nouveau attendre que le GIL soit libรฉrรฉ par le thread-2.
Pour cette raison, un seul thread peut accรฉder ร l'interprรฉteur ร tout moment, ce qui signifie qu'il n'y aura qu'un seul thread exรฉcutant le code Python ร un moment donnรฉ.
Cela convient dans un processeur monocลur car cela utiliserait le dรฉcoupage temporel (voir la premiรจre section de ce didacticiel) pour gรฉrer les threads. Cependant, dans le cas de processeurs multicลurs, une fonction liรฉe au processeur s'exรฉcutant sur plusieurs threads aura un impact considรฉrable sur l'efficacitรฉ du programme puisqu'il n'utilisera pas rรฉellement tous les cลurs disponibles en mรชme temps.
Pourquoi GIL รฉtait-il nรฉcessaire ?
Les CPython Le garbage collector utilise une technique efficace de gestion de la mรฉmoire appelรฉe comptage de rรฉfรฉrences. Voici comment cela fonctionne : chaque objet en Python a un nombre de rรฉfรฉrences, qui augmente lorsqu'il est assignรฉ ร un nouveau nom de variable ou ajoutรฉ ร un conteneur (comme les tuples, les listes, etc.). De mรชme, le nombre de rรฉfรฉrences diminue lorsque la rรฉfรฉrence sort de la portรฉe ou lorsque l'instruction del est appelรฉe. Lorsque le nombre de rรฉfรฉrences d'un objet atteint 0, il est rรฉcupรฉrรฉ et la mรฉmoire allouรฉe est libรฉrรฉe.
Mais le problรจme est que la variable de comptage de rรฉfรฉrences est sujette ร des conditions de concurrence comme toute autre variable globale. Pour rรฉsoudre ce problรจme, les dรฉveloppeurs de Python ont dรฉcidรฉ d'utiliser le verrou global de l'interprรฉteur. L'autre option consistait ร ajouter un verrou ร chaque objet, ce qui aurait entraรฎnรฉ des blocages et une augmentation de la surcharge due aux appels acquire() et release().
Par consรฉquent, GIL constitue une restriction importante pour les programmes Python multithread exรฉcutant des opรฉrations lourdes liรฉes au processeur (ce qui les rend effectivement monothread). Si vous souhaitez utiliser plusieurs cลurs de processeur dans votre application, utilisez l'option multitraitement module ร la place.
Rรฉsumรฉ
- Python prend en charge 2 modules pour le multithreading :
- __fil module : il fournit une implรฉmentation de bas niveau pour le threading et est obsolรจte.
- module de filetage: Il fournit une implรฉmentation de haut niveau pour le multithreading et constitue le standard actuel.
- Pour crรฉer un thread ร l'aide du module threading, vous devez procรฉder comme suit :
- Crรฉez une classe qui รฉtend le Fil ร coudre classe.
- Remplacez son constructeur (__init__).
- Remplacer son Cours() mรฉthode.
- Crรฉez un objet de cette classe.
- Un thread peut รชtre exรฉcutรฉ en appelant le dรฉmarrer() mรฉthode.
- Le joindre() La mรฉthode peut รชtre utilisรฉe pour bloquer dโautres threads jusquโร ce que ce thread (celui sur lequel join a รฉtรฉ appelรฉ) termine son exรฉcution.
- Une condition de concurrence critique se produit lorsque plusieurs threads accรจdent ou modifient une ressource partagรฉe en mรชme temps.
- Cela peut รชtre รฉvitรฉ en Syncfils chromisants.
- Python prend en charge 6 faรงons de synchroniser les threads :
- Verrouillage
- RLocks
- Semaphores
- Conditions
- รฉvรฉnements, et
- Barriรจres
- Les verrous permettent uniquement ร un thread particulier qui a acquis le verrou d'entrer dans la section critique.
- Un verrou a 2 mรฉthodes principales :
- acquรฉrir(): Il dรฉfinit l'รฉtat de verrouillage sur fermรฉ ร clef. S'il est appelรฉ sur un objet verrouillรฉ, il bloque jusqu'ร ce que la ressource soit libre.
- Libรฉration(): Il dรฉfinit l'รฉtat de verrouillage sur dรฉverrouillรฉ et revient. S'il est appelรฉ sur un objet dรฉverrouillรฉ, il renvoie false.
- Le verrouillage global de l'interprรฉteur est un mรฉcanisme par lequel seul 1 CPython le processus d'interprรฉtation peut s'exรฉcuter ร la fois.
- Il a รฉtรฉ utilisรฉ pour faciliter la fonctionnalitรฉ de comptage de rรฉfรฉrences de CPythonle ramasse-miettes de s.
- Pour faire Python pour les applications nรฉcessitant beaucoup d'opรฉrations CPU, vous devez utiliser le module multitraitement.






