Non sono chiaro il motivo per cui l'API sub-interpreter esiste e perché viene utilizzata in moduli come il modulo apache mod_wsgi. Viene utilizzato principalmente per la creazione di una sandbox di sicurezza per diverse applicazioni in esecuzione all'interno dello stesso processo o è un modo per consentire la concorrenza con più thread? Forse entrambi? Ci sono altri scopi?Qual è lo scopo dell'API sub-interpreter in CPython?
risposta
Immagino che lo scopo sia creare ambienti di esecuzione Python separati. Ad esempio, mod_wsgi (modulo Apache Python) ospita un singolo interprete python e quindi ospita più applicazioni all'interno di interpreti secondari (nella configurazione predefinita).
Alcuni punti chiave del documentation:
- questo è un (quasi) ambiente totalmente separato per l'esecuzione di codice Python. In particolare, il nuovo interprete dispone di versioni separate e indipendenti di tutti i moduli importati, compresi i moduli fondamentali
__builtin__
,__main__
esys
. - Anche la tabella dei moduli caricati (sys.modules) e il percorso di ricerca del modulo (sys.path) sono separati.
- Poiché i subinterpretatori (e l'interprete principale) fanno parte dello stesso processo, l'isolamento tra di essi non è perfetto, ad esempio utilizzando operazioni di file di basso livello come os.close() che possono (accidentalmente o intenzionalmente) si influenzano reciprocamente sui file aperti.
- A causa del modo in cui le estensioni sono condivise tra (sotto-) interpreti, alcune estensioni potrebbero non funzionare correttamente; questo è particolarmente probabile quando l'estensione fa uso di variabili globali (statiche) o quando l'estensione manipola il dizionario del modulo dopo l'inizializzazione.
Come ho capito ultimo, l'idea doveva essere in grado di eseguire più applicazioni così come copie multiple della stessa applicazione all'interno dello stesso processo.
Questa è una funzionalità presente in altri linguaggi di scripting (ad esempio TCL), ed è di particolare utilità per i costruttori di GUI, server web, ecc
Si rompe in python, perché molte estensioni non sono sicuri multiple-interprete, quindi le azioni di un interprete potrebbero influenzare le variabili in un altro interprete.
Ciò significa che diversi interpreti possono essere eseguiti contemporaneamente in thread diversi? Non sono ancora chiaro se diversi interpreti nello stesso processo condividano o meno lo stesso GIL. –
GIL è un oggetto globale per il processo ed è condiviso tra i subinterpreti. Quindi no, non possono essere eseguiti contemporaneamente. http://objectmix.com/python/377035-multiple-independent-python-interpreters-c-c-program.html – codeape
Grazie per il link! Ho cercato di capire se c'è un modo per aggirare i limiti di threading di Python e GIL, e non mi viene in mente nulla. –