2009-04-16 13 views
15

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

14

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__ e sys.
  • 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.
+0

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. –

+3

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

+0

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. –

0

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.