? Se avete lavorato con Python e vuole iniziare a sperimentare con tecniche di programmazione più avanzate , l'apprendimento su di blocco interprete globale ( GIL ) è una buona idea . GIL è un algoritmo che gestisce l'esecuzione di più thread in un programma Python . GIL è un requisito quando si lavora con più thread , perché la gestione della memoria di CPython non è thread -safe . Inoltre , la GIL è stato conosciuto per degradare una performance programmi . Un esempio è che può richiedere più tempo per i due thread per chiamare la stessa funzione di un thread chiamando la funzione due volte . Utilizzando GIL
un programma Python multi-threaded di un thread non può accedere in modo sicuro oggetti Python a meno che la GIL è detenuto dal thread corrente . La GIL fa in modo che entrambi i fili siano correttamente l'aggiornamento dei riferimenti agli oggetti di essere chiamati . Per iniziare a utilizzare il GIL è necessario salvare lo stato di filo in una variabile di posizione e rilasciare il blocco interprete globale . A questo punto è possibile eseguire l'operazione di input /output di blocco e riacquisire il blocco interprete globale quando è completo . Infine, ripristinare lo stato filo dalla variabile locale . È possibile utilizzare il seguente esempio di macro per semplificare il processo :
Py_BEGIN_ALLOW_THREADS ... Fare un po ' di blocco operazione di I /O ... Py_END_ALLOW_THREADS
Calling Python Codice
Spesso le discussioni sono creati da altri linguaggi di programmazione come C , e se avete bisogno di chiamare multipla discussioni allora avete bisogno di usare GIL . È necessario registrare questi fili con un interprete attraverso una struttura dati stato del thread e quindi acquisire la GIL . Per semplificare questo processo, è possibile utilizzare la funzione " PyGILState_Release ( ) " " PyGILState_Ensure ( )" e . Il seguente è un esempio su come applicare questo concetto :
PyGILState_STATE gstate ; gstate = PyGILState_Ensure ( ) ;/* Eseguire azioni Python qui . * /result = CallSomeFunction ( ) ;/* valutare risultato o gestire eccezione * //* Rilasciare il thread. No Python API consentito di là di questo punto . * /PyGILState_Release ( gstate ) ;
Python Discussioni
In Python un thread è un vero e proprio thread di sistema come qualsiasi altra esecuzione del programma. Durante l'esecuzione di un thread Python crea una piccola struttura di dati con lo stato interprete . Dopo questo un nuovo thread è lanciato e si chiama " PyEval_CallObject . " L'ultimo passo è una semplice funzione C che corre qualunque Python specificati . La GIL controlla attentamente ogni thread di esecuzione . Il seguente è un esempio di un thread Python :
import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (self , count) : threading.Thread.__init__ (auto ) self.count = countdef run (auto ) : mentre self.count > 0 : print " Conto alla rovescia " , self.countself.count - = 1time.sleep ( 5) ritorno
GIL Problemi e sostituzione
sviluppatori Python
hanno discusso l'eliminazione della GIL , ma hanno incontrato alcune difficoltà . Un problema spesso citato con GIL è che impedisce ai programmi multithread CPython da sfruttare appieno i processori multi-core . Eventuale sostituzione GIL deve essere semplice e concorrente quando si lavora con fili . Deve essere più veloce di GIL e deve avere una buona compatibilità API . Un esempio per la compatibilità API è quello di avere un buon tracciamento durante l'enumerazione degli oggetti a cui punta.