Какова цель API-интерфейса суб-интерпретатора в CPython?

Я не понимаю, почему существует API-интерфейс суб-интерпретатора и почему он используется в таких модулях, как mod_wsgi apache module. Используется ли он в основном для создания изолированной программной среды для различных приложений, работающих в одном и том же процессе, или это способ разрешить concurrency с несколькими потоками? Возможно оба? Существуют ли другие цели?

Ответы

Ответ 1

Я предполагаю, что целью является создание отдельных сред выполнения python. Например, mod_wsgi (модуль Apache Python) размещает один интерпретатор python, а затем размещает несколько приложений в субширинках (в конфигурации по умолчанию).

Некоторые ключевые моменты из документации:

  • Это (почти) полностью отдельная среда для выполнения кода Python. В частности, новый интерпретатор имеет отдельные независимые версии всех импортированных модулей, включая основные модули __builtin__, __main__ и sys.
  • Таблица загруженных модулей (sys.modules) и путь поиска модуля (sys.path) также разделены.
  • Поскольку суб-интерпретаторы (и основной интерпретатор) являются частью одного и того же процесса, изоляция между ними не идеальна - например, используя низкоуровневые файловые операции, такие как os.close(), они могут (случайно или злонамеренно) влиять другие открывают файлы.
  • Из-за того, что расширения используются совместно (суб) интерпретаторами, некоторые расширения могут работать некорректно; это особенно вероятно, когда расширение использует (статические) глобальные переменные или когда расширение обрабатывает словарь своих модулей после его инициализации.

Ответ 2

Как я понял, последняя идея заключалась в том, чтобы иметь возможность выполнять несколько приложений, а также несколько копий одного и того же приложения в одном и том же процессе.

Это функция, встречающаяся на других языках сценариев (например, TCL) и особенно полезная для разработчиков gui, веб-серверов и т.д.

Он разбивается на python, потому что многие расширения не являются безопасными несколькими интерпретаторами, поэтому одно действие интерпретатора может влиять на переменные в другом интерпретаторе.