Python LanguageLavorare attorno al Global Interpreter Lock (GIL)


Osservazioni

Perché c'è un GIL?

La GIL è stata utilizzata in CPython sin dall'inizio dei thread Python, nel 1992. È progettata per garantire la sicurezza dei thread nell'esecuzione del codice Python. Gli interpreti Python scritti con un GIL impediscono a più thread nativi di eseguire contemporaneamente bytecode Python. Ciò semplifica i plug-in per garantire che il loro codice sia sicuro per i thread: basta bloccare GIL e solo il thread attivo può essere eseguito, quindi il codice è automaticamente thread-safe.

Versione breve: GIL garantisce che, indipendentemente dal numero di processori e thread, verrà eseguito solo un thread di un interprete Python alla volta.

Questo ha molti benefici di facilità d'uso, ma ha anche molti benefici negativi.

Nota che un GIL non è un requirment del linguaggio Python. Di conseguenza, non puoi accedere a GIL direttamente dal codice Python standard. Non tutte le implementazioni di Python usano un GIL.

Interpreti che hanno un GIL: CPython, PyPy, Cython (ma puoi disabilitare GIL con nogil )

Interpreti che non hanno un GIL: Jython, IronPython

Dettagli su come funziona GIL:

Quando un thread è in esecuzione, blocca GIL. Quando un thread vuole essere eseguito, richiede GIL e attende finché non è disponibile. In CPython, prima della versione 3.2, il thread in esecuzione controllava dopo un certo numero di istruzioni python per vedere se altro codice voleva il lock (cioè, rilasciava il lock e poi lo richiedeva nuovamente). Questo metodo tendeva a causare l'inattività del thread, in gran parte perché il thread che rilasciava il blocco lo acquisiva nuovamente prima che i thread in attesa avessero la possibilità di riattivarsi. Dalla versione 3.2, i thread che vogliono che il GIL attenda il blocco per un po 'di tempo e, dopo questo periodo, impostano una variabile condivisa che impone il rendimento del thread in esecuzione. Ciò può comunque comportare tempi di esecuzione drasticamente più lunghi. Vedi i collegamenti sottostanti da dabeaz.com (nella sezione dei riferimenti) per maggiori dettagli.

CPython rilascia automaticamente GIL quando un thread esegue un'operazione di I / O. Le librerie di elaborazione delle immagini e le operazioni di crunch numerico rilasciano GIL prima di elaborarle.

Benefici della GIL

Per gli interpreti che usano GIL, GIL è sistemico. È usato per preservare lo stato dell'applicazione. I vantaggi includono:
  • Garbage Collection: i conteggi dei riferimenti a livello di thread devono essere modificati mentre GIL è bloccato. In CPython, tutta la collezione di garbarge è legata a GIL. Questo è un grande; vedi l'articolo wiki di python.org sul GIL (elencato in Riferimenti, sotto) per i dettagli su cosa deve ancora essere funzionale se si volesse rimuovere GIL.
  • Facilità per i programmatori che si occupano di GIL - il blocco di tutto è semplicistico, ma facile da codificare
  • Facilita l'importazione di moduli da altre lingue

Conseguenze del GIL

GIL consente solo a un thread di eseguire codice Python alla volta all'interno dell'interprete python. Ciò significa che il multithreading di processi che eseguono rigorosi codici Python semplicemente non funziona. Quando si utilizzano i thread contro GIL, è probabile che si ottengano prestazioni peggiori con i thread rispetto a quando si esegue una singola discussione.

Riferimenti:

https://wiki.python.org/moin/GlobalInterpreterLock - riepilogo rapido di ciò che fa, dettagli precisi su tutti i vantaggi

http://programmers.stackexchange.com/questions/186889/why-was-python-written-with-the-gil - riassunto scritto in modo chiaro

http://www.dabeaz.com/python/UnderstandingGIL.pdf - come funziona GIL e perché rallenta su più core

http://www.dabeaz.com/GIL/gilvis/index.html - visualizzazione dei dati che mostrano come GIL blocca i thread

http://jeffknupp.com/blog/2012/03/31/pythons-hardest-problem/ - storia semplice da capire del problema GIL

https://jeffknupp.com/blog/2013/06/30/pythons-hardest-problem-revisited/ - dettagli sui modi per aggirare i limiti del GIL

Lavorare attorno al Global Interpreter Lock (GIL) Esempi correlati