Che cosa è un Python GIL?

October 18

Che cosa è un Python GIL?


Se siete stati a lavorare con Python e vogliono iniziare a sperimentare con tecniche di programmazione più avanzate, l'apprendimento sul 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 due fili per chiamare la stessa funzione di un thread chiamando due volte la funzione.

utilizzando GIL

In un programma multi-threaded Python un thread non può accedere in modo sicuro oggetti Python a meno che il GIL è detenuto dal thread corrente. La GIL fa in modo che entrambi i fili siano correttamente l'aggiornamento dei riferimenti agli oggetti chiamati. Per iniziare a utilizzare il GIL è necessario salvare lo stato del thread in una variabile posizione e rilasciare il blocco interprete globale. A questo punto è possibile eseguire l'operazione di input / output blocco e riacquisire il blocco interprete globale quando è completo. Infine, ripristinare lo stato del filo dalla variabile locale. È possibile utilizzare il seguente esempio di macro per semplificare il processo:

Py_BEGIN_ALLOW_THREADS
... Fare qualche blocco operazione di I / O ...
Py_END_ALLOW_THREADS

Chiamare codice Python

Spesso le discussioni sono creati da altri linguaggi di programmazione come C e se è necessario chiamare più thread, allora è necessario utilizzare GIL. È necessario registrare questi fili con un interprete attraverso una struttura dati di stato filo e quindi acquisire il GIL. Per semplificare questo processo è possibile utilizzare il "PyGILState_Ensure) (" e "PyGILState_Release ()" funzioni. Quanto segue è un esempio su come applicare questo concetto:

PyGILState_STATE gstate;
gstate = PyGILState_Ensure ();
/ Esegui azioni Python qui. /
risultato = CallSomeFunction ();
/ Risultato valutare o gestire un'eccezione /
/ Rilasciare il filo. No Python API consentito al di là di questo punto. /
PyGILState_Release (gstate);

Python Discussioni

In Python un filo è un vero filo 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 viene lanciato e chiama il "PyEval_CallObject." L'ultimo passo è una semplice funzione C che corre qualsiasi Python specificato. La GIL controlla accuratamente ogni esecuzione thread. Quanto segue è un esempio di un thread Python:

tempo di importazione
import threading
Classe CountdownThread (threading.Thread):
def init (auto, count):
threading.Thread. init (auto)
self.count = count
run DEF (auto):
mentre self.count> 0:
stampare "Conto alla rovescia", self.count
self.count - = 1
time.sleep (5)
ritorno

Problemi GIL e sostituzione

sviluppatori Python hanno discusso l'eliminazione della GIL, ma hanno incontrato alcune sfide. Un problema spesso menzionato con Gil è che impedisce ai programmi multithreaded CPython da sfruttare appieno i processori multi-core. L'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 quando enumerare gli oggetti a cui punta.