2009-04-16 5 views
15

Ich bin unklar, warum die Sub-Interpreter-API existiert und warum es in Modulen wie dem mod_wsgi Apache-Modul verwendet wird. Wird es hauptsächlich zum Erstellen einer Sicherheits-Sandbox für verschiedene Anwendungen verwendet, die innerhalb desselben Prozesses ausgeführt werden, oder ist es eine Möglichkeit, die gleichzeitige Verwendung mehrerer Threads zuzulassen? Vielleicht beide? Gibt es andere Zwecke?Was ist der Zweck der Sub-Interpreter-API in CPython?

Antwort

14

Ich stelle mir vor, der Zweck ist, separate Python-Ausführungsumgebungen zu erstellen. Zum Beispiel hostet mod_wsgi (Apache Python-Modul) einen einzelnen Python-Interpreter und hostet dann mehrere Anwendungen innerhalb von Subinterpretern (in der Standardkonfiguration).

Einige der wichtigsten Punkte aus den documentation:

  • Dies ist eine (fast) völlig separate Umgebung für die Ausführung von Code Python. Insbesondere hat der neue Interpreter separate, unabhängige Versionen aller importierten Module, einschließlich der grundlegenden Module __builtin__, __main__ und sys.
  • Die Tabelle der geladenen Module (sys.modules) und der Modul-Suchpfad (sys.path) sind ebenfalls getrennt.
  • Da Sub-Interpreter (und der Hauptinterpreter) Teil desselben Prozesses sind, ist die Isolierung zwischen ihnen nicht perfekt - zum Beispiel können Low-Level-Dateioperationen wie os.close() (versehentlich oder böswillig) verwendet werden) beeinflussen die geöffneten Dateien des jeweils anderen.
  • Aufgrund der Art und Weise, in der Erweiterungen zwischen (Sub-) Interpretern geteilt werden, funktionieren einige Erweiterungen möglicherweise nicht richtig. Dies ist besonders wahrscheinlich, wenn die Erweiterung (statische) globale Variablen verwendet oder wenn die Erweiterung das Wörterbuch des Moduls nach seiner Initialisierung manipuliert.
+0

Bedeutet dies, dass verschiedene Interpreter gleichzeitig in verschiedenen Threads ausgeführt werden können? Ich bin immer noch unklar, ob verschiedene Dolmetscher im selben Prozess die gleiche GIL teilen. –

+3

Die GIL ist ein globales Objekt für den Prozess und wird von den Sub-Interpretern geteilt. Also nein, sie können nicht gleichzeitig laufen. http://objectmix.com/python/377035-multiple-independent-python-interpreters-c-c-program.html – codeape

+0

Danke für den Link! Ich habe versucht herauszufinden, ob die Threading-Beschränkungen von Python und der GIL umgangen sind, und ich habe nichts vor. –

0

Wie ich es zuletzt verstanden, war die Idee, mehrere Anwendungen sowie mehrere Kopien derselben Anwendung innerhalb des gleichen Prozesses ausführen zu können.

Dies ist eine Funktion in anderen Skriptsprachen (zB TCL) gefunden und ist von besonderem Nutzen zu gui Builder, Web-Server, etc.

Es ist in Python bricht, weil viele Erweiterungen nicht multiple-Interpreter sicher sind, So können die Aktionen eines Interpreters die Variablen in einem anderen Interpreter beeinflussen.