Remarque: partout où je mentionne, thread
je veux dire spécifiquement les threads en python jusqu'à ce que cela soit explicitement indiqué.
Les threads fonctionnent un peu différemment en python si vous venez de l' C/C++
arrière-plan. En python, un seul thread peut être en état d'exécution à un moment donné, ce qui signifie que les threads en python ne peuvent pas vraiment tirer parti de la puissance de plusieurs cœurs de traitement car, de par leur conception, il n'est pas possible pour les threads de s'exécuter en parallèle sur plusieurs cœurs.
Comme la gestion de la mémoire en python n'est pas sécurisée pour les threads, chaque thread nécessite un accès exclusif aux structures de données dans l'interpréteur python. Cet accès exclusif est acquis par un mécanisme appelé (verrou d'interprétation global) .GIL
Why does python use GIL?
Afin d'empêcher plusieurs threads d'accéder simultanément à l'état de l'interpréteur et de corrompre l'état de l'interpréteur.
L'idée est qu'à chaque fois qu'un thread est en cours d'exécution (même s'il s'agit du thread principal) , un GIL est acquis et après un certain intervalle de temps prédéfini, le GIL est libéré par le thread actuel et réacquis par un autre thread (le cas échéant).
Why not simply remove GIL?
Ce n'est pas qu'il soit impossible de supprimer GIL, c'est juste qu'au cours de cette opération, nous finissons par mettre plusieurs verrous à l'intérieur de l'interpréteur afin de sérialiser l'accès, ce qui rend même une seule application threadée moins performante.
Ainsi, le coût de la suppression de GIL est payé par les performances réduites d'une seule application threadée, ce qui n'est jamais souhaité.
So when does thread switching occurs in python?
Le changement de thread se produit lorsque GIL est libéré, alors quand GIL est-il publié? Il y a deux scénarios à prendre en considération.
Si un thread effectue des opérations liées au processeur (traitement d'image Ex).
Dans les anciennes versions de python, le changement de thread se produisait après un nombre fixe d'instructions python.Il était par défaut défini sur 100
. peut très sauvagement de la milliseconde à même une seconde. Par conséquent, la libération de GIL après chaque 100
instruction, quel que soit le temps qu'elles prennent pour s'exécuter, est une mauvaise politique.
Dans les nouvelles versions, au lieu d'utiliser le nombre d'instructions comme métrique pour changer de thread, un intervalle de temps configurable est utilisé. L'intervalle de commutation par défaut est de 5 millisecondes. Vous pouvez obtenir l'intervalle de commutation actuel à l'aide de sys.getswitchinterval()
. Cela peut être modifié en utilisantsys.setswitchinterval()
Si un thread effectue des opérations liées aux
E / S (accès au système de fichiers Ex ou E / S réseau)
GIL est libéré chaque fois que le thread attend que certaines opérations d'E / S soient terminées.
Which thread to switch to next?
L'interpréteur n'a pas son propre ordonnanceur, quel thread est planifié à la fin de l'intervalle est la décision du système d'exploitation. .