Si vous avez déjà travaillé avec Python et que vous voulez commencer à expérimenter avec les techniques de programmation avancées , l'apprentissage de verrouillage interprète global ( GIL ) est une bonne idée . GIL est un algorithme qui gère l'exécution de plusieurs threads dans un programme Python. GIL est une exigence lorsque vous travaillez avec plusieurs threads , car la gestion de la mémoire de CPython n'est pas thread-safe . En outre, le GIL a été connu pour dégrader la performance des programmes. Un exemple est que cela peut prendre plus de temps pour deux threads pour appeler la même fonction qu'un thread appelant deux fois la fonction. Utiliser GIL
Dans un programme Python multi-thread un thread ne peut pas accéder en toute sécurité des objets Python à moins que le GIL est détenu par le thread courant . Le GIL permet de s'assurer que les deux fils sont correctement mise à jour des références d'objet appelé. Pour commencer à utiliser le GIL vous devez enregistrer l'état de fil dans une variable d'emplacement et libérer le verrou de l'interpréteur mondiale. À ce stade, vous pouvez effectuer votre opération d'entrée /sortie de blocage et de réacquérir le verrou de l'interpréteur mondial quand il est complet . Enfin, restaurer l'état du fil de la variable locale. Vous pouvez utiliser l'exemple de macro suivant pour simplifier le processus : Photos
Py_BEGIN_ALLOW_THREADS ... Faites un peu de bloquer l'opération I /O ... Py_END_ALLOW_THREADS
Calling Python code
Souvent threads sont créés à partir d'autres langages de programmation tels que C et si vous avez besoin d'appeler multiple threads , alors vous devez utiliser GIL . Vous devez d'abord enregistrer ces discussions avec un interprète dans une structure de données d'état du fil , puis acquérir le GIL . Pour simplifier ce processus, vous pouvez utiliser la fonction " PyGILState_Ensure ()" et " fonctions PyGILState_Release () " . Ce qui suit est un exemple sur la façon d' appliquer ce concept :
PyGILState_STATE gstate ; gstate = PyGILState_Ensure () ;/* Effectuer des actions Python ici . * /resultat = CallSomeFunction ( ) ;/* évaluer résultat ou manipuler exception * //* Libérer le fil. Pas API Python autorisé au-delà de ce point. * /PyGILState_Release ( gstate ) ;
Python discussions
Python un thread est un véritable fil du système que tout autre l'exécution du programme . Lors de l'exécution d'un fil Python crée une petite structure de données avec l'état d' interprète. Après cela un nouveau thread est lancé et il appelle la " PyEval_CallObject . " La dernière étape est une fonction de C simple qui fonctionne quel que soit Python spécifiés. Le GIL contrôle soigneusement l'exécution de chaque thread. Ce qui suit est un exemple d'un fil Python :
importation timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (self , count) : threading.Thread.__init__ (auto ) self.count = countdef course (auto- ) : tout self.count > 0 : print " Compte à rebours " , self.countself.count - = 1time.sleep (5) retour
GIL problèmes et remplacement
développeurs Python
ont discuté de l'élimination de la GIL , mais se sont heurtées à certaines difficultés. Un problème souvent mentionné avec GIL est qu'elle empêche les programmes de CPython multithread de tirer pleinement parti des processeurs multi-core . Tout remplacement GIL doit être simple et simultanée lorsque l'on travaille avec des fils . Doit être plus rapide que Gil et doit avoir une bonne compatibilité avec les API . Un exemple de la compatibilité API est d'avoir un bon suivi lors de l'énumération des objets il pointe.