¿Cuál es el propósito de la API del sub-intérprete en CPython?

No tengo claro por qué existe la API del sub-intérprete y por qué se usa en módulos como el módulo apache mod_wsgi. ¿Se utiliza principalmente para crear un recinto de seguridad para diferentes aplicaciones que se ejecutan dentro del mismo proceso, o es una forma de permitir la concurrencia con varios subprocesos? ¿Tal vez ambos? ¿Hay otros propósitos?

Me imagino que el propósito es crear entornos de ejecución de Python separados. Por ejemplo, mod_wsgi (módulo de Apache Python) aloja un solo intérprete de Python y luego aloja múltiples aplicaciones dentro de los sub-intérpretes (en la configuración predeterminada).

Algunos puntos clave de la documentación :

  • Este es un entorno (casi) totalmente separado para la ejecución del código Python. En particular, el nuevo intérprete tiene versiones separadas e independientes de todos los módulos importados, incluidos los módulos fundamentales __builtin__ , __main__ y sys .
  • La tabla de módulos cargados (sys.modules) y la ruta de búsqueda del módulo (sys.path) también están separadas.
  • Debido a que los sub-intérpretes (y el intérprete principal) son parte del mismo proceso, el aislamiento entre ellos no es perfecto; por ejemplo, al usar operaciones de archivos de bajo nivel como os.close (), pueden (accidental o maliciosamente) afectar a cada uno Otros archivos abiertos.
  • Debido a la forma en que las extensiones se comparten entre (sub) intérpretes, es posible que algunas extensiones no funcionen correctamente; esto es especialmente probable cuando la extensión hace uso de variables globales (estáticas), o cuando la extensión manipula el diccionario de su módulo después de su inicialización.

Como lo entendí por última vez, la idea era poder ejecutar múltiples aplicaciones, así como múltiples copias de la misma aplicación dentro del mismo proceso.

Esta es una característica que se encuentra en otros lenguajes de secuencias de comandos (por ejemplo, TCL), y es de particular uso para los desarrolladores de GUI, servidores web, etc.

Se rompe en Python porque muchas extensiones no son seguras para intérpretes múltiples, por lo que las acciones de un intérprete podrían afectar las variables en otro intérprete.