2009-10-18 13 views
8

Vedo spesso persone che parlano che GIL è per Interprete Python (anche qui su StackOverflow).Python GIL è veramente per interprete?

Ma quello che vedo nel codice sorgente sembra essere che GIL è una variabile globale e quindi c'è un GIL per tutti gli interpreti in ogni processo Python. So che l'hanno fatto perché non c'è alcun oggetto interprete passato come Lua o TCL, non è stato progettato bene all'inizio. E il thread storage locale sembra non essere portabile per i ragazzi di Python da usare.

È corretto? Ho dato un'occhiata alla versione 2.4 che sto usando in un progetto qui.

Questo era cambiato nelle versioni successive, in particolare nella 3.0?

risposta

7

Il GIL è effettivamente per-processo, non per interprete. Questo è invariato in 3.x.

0

Credo sia vero (almeno come in Python 2.6) che ogni processo possa avere al massimo un interprete CPython incorporato (altri runtime possono avere vincoli diversi). Non sono sicuro che si tratti di un problema con GIL di per sé, ma è probabilmente dovuto allo stato globale o alla protezione dallo stato globale in conflitto nei moduli C di terze parti. Dalla CPython API Docs: (prima senza chiamare Py_Finalize())

[Py ___ Initialize()] è un no-op quando viene chiamato per una seconda volta. Non c'è valore di ritorno; è un errore fatale se l'inizializzazione fallisce.

Potreste essere interessati al progetto Unladen Swallow, che mira infine a rimuovere il GIL interamente da CPython. Altri runtime di Python non hanno affatto il GIL, come (credo) Stackless Python e certamente Jython.

Si noti inoltre che GIL è still present in CPython 3.x.

+1

Un sacco di progetti hanno rimosso il GIL da CPython in precedenza. Unladen Swallow non è il primo. Comunque non hanno funzionato bene come la versione GIL, quindi nessuno li usa. – nosklo

+1

Inoltre, lo stackless non rimuove GIL. In effetti, qualsiasi operazione di blocco in qualsiasi micropiastra senza stack bloccherà l'intera applicazione. – nosklo

+0

E Jython è così lento da essere inutilizzabile, a meno che non lo si usi solo per un plug-in di scripting in un programma java in cui la maggior parte del lavoro viene eseguita in Python. – Lothar

2

Forse la confusione si verifica perché molte persone pensano che Python abbia un interprete per processo. Ricordo di aver letto che il supporto per più interpreti tramite l'API C era in gran parte non testato e quasi mai utilizzato. (E quando ho provato, non ha funzionato correttamente.)