Facciamo capire prima quello che il pitone GIL prevede:
Qualsiasi operazione/istruzione viene eseguita in l'interprete. GIL garantisce che l'interprete sia tenuto da un singolo thread al in un particolare istante di tempo. E il tuo programma python con più thread funziona in un singolo interprete. In ogni particolare istante di tempo, questo interprete è tenuto da un singolo thread. Significa che solo il thread che regge l'interprete è in esecuzione allo in qualsiasi istante di tempo.
Ora, perché è che un problema:
La macchina potrebbe essere avere più core/processori. Inoltre, più core consentono l'esecuzione simultanea di più thread in modo che più thread possano eseguire in qualsiasi momento specifico.. Ma poiché l'interprete è contenuto da un singolo thread, altri thread non stanno facendo nulla anche se hanno accesso a un core. Quindi, non si ottiene alcun vantaggio fornito da più core, perché in qualsiasi istante viene utilizzato solo un singolo core, che è il nucleo utilizzato dal thread attualmente in possesso dell'interprete. Quindi, il tuo programma impiegherà il tempo necessario per eseguirlo come se fosse un programma a thread singolo.
Tuttavia, le operazioni potenzialmente bloccanti o di lunga durata, come I/O, elaborazione immagine e numerazione dei numeri NumPy, si verificano all'esterno di GIL. Tratto da here. Pertanto, per tali operazioni, un'operazione con multithreading sarà ancora più veloce di un'operazione a thread singolo nonostante la presenza di GIL. Quindi, GIL non è sempre un collo di bottiglia.
Modifica: GIL è un dettaglio di implementazione di CPython. PyPy e Jython non hanno GIL, quindi un programma veramente multithread dovrebbe essere possibile in loro, pensavo che non ho mai usato PyPy e Jython e non ne sono sicuro.
fonte
2013-12-06 07:55:24
possibile duplicato di [Perché il Global Interpreter Lock?] (Http://stackoverflow.com/questions/265687/why-the-global-interpreter-lock) –