C'est plus facile à comprendre. GIL garantit que le code d'octet python n'a qu'un seul thread natif exécuté dans le processus en même temps. Cependant, la logique du byte code lui-même nécessite toujours un verrouillage/exclusion mutuelle, etc. pour garantir que le thread peut être réentrant, car le byte code peut être interrompu à tout moment pendant le processus en cours et basculé vers un autre thread.
Un exemple simple :
Un morceau de code de compteur : //Étape 1 counter = get_counter() //Étape 2 counter += 1 / / Étape 3 set_counter(counter)
Supposons que le compteur initial soit 0 et que deux threads exécutent ce code Python en même temps sans aucune synchronisation
Le résultat attendu devrait être que les deux threads ont compté et le compteur final devrait être 2 :
Cependant, faute de verrouillage/exclusion mutuelle, la situation d'exécution est la suivante :
Lorsque le thread A termine l'exécution de l'étape 1, le compteur est à 0, ce qui signifie passer au thread B
Le thread B a exécuté avec succès les étapes 1,2,3. Le compteur est maintenant à 1, puis passe à A
.
Le fil A continue d'exécuter l'étape 2 et obtient le compteur à 1, puis l'étape 3 définit le compteur à 1.
C'est plus facile à comprendre. GIL garantit que le code d'octet python n'a qu'un seul thread natif exécuté
Un exemple simple :dans le processus en même temps. Cependant, la logique du byte code lui-même nécessite toujours un verrouillage/exclusion mutuelle, etc. pour garantir que le thread peut être réentrant, car le byte code peut être interrompu à tout moment pendant le processus en cours et basculé vers un autre thread.
Un morceau de code de compteur :
Supposons que le compteur initial soit 0 et que deux threads exécutent ce code Python en même temps sans aucune synchronisation//Étape 1
counter = get_counter()
//Étape 2
counter += 1
/ / Étape 3
set_counter(counter)
Le résultat attendu devrait être que les deux threads ont compté et le compteur final devrait être 2 :
Cependant, faute de verrouillage/exclusion mutuelle, la situation d'exécution est la suivante :
Lorsque le thread A termine l'exécution de l'étape 1, le compteur est à 0, ce qui signifie passer au thread B
Le thread B a exécuté avec succès les étapes 1,2,3. Le compteur est maintenant à 1, puis passe à A Le fil A continue d'exécuter l'étape 2 et obtient le compteur à 1, puis l'étape 3 définit le compteur à 1. -
Le résultat final est 1.
.