Я не понимаю, почему существует API-интерфейс суб-интерпретатора и почему он используется в таких модулях, как mod_wsgi apache module. Используется ли он в основном для создания изолированной программной среды для различных приложений, работающих в одном и том же процессе, или это способ разрешить concurrency с несколькими потоками? Возможно оба? Существуют ли другие цели?
Какова цель API-интерфейса суб-интерпретатора в CPython?
Ответ 1
Я предполагаю, что целью является создание отдельных сред выполнения python. Например, mod_wsgi (модуль Apache Python) размещает один интерпретатор python, а затем размещает несколько приложений в субширинках (в конфигурации по умолчанию).
Некоторые ключевые моменты из документации:
- Это (почти) полностью отдельная среда для выполнения кода Python. В частности, новый интерпретатор имеет отдельные независимые версии всех импортированных модулей, включая основные модули
__builtin__
,__main__
иsys
. - Таблица загруженных модулей (sys.modules) и путь поиска модуля (sys.path) также разделены.
- Поскольку суб-интерпретаторы (и основной интерпретатор) являются частью одного и того же процесса, изоляция между ними не идеальна - например, используя низкоуровневые файловые операции, такие как os.close(), они могут (случайно или злонамеренно) влиять другие открывают файлы.
- Из-за того, что расширения используются совместно (суб) интерпретаторами, некоторые расширения могут работать некорректно; это особенно вероятно, когда расширение использует (статические) глобальные переменные или когда расширение обрабатывает словарь своих модулей после его инициализации.
Ответ 2
Как я понял, последняя идея заключалась в том, чтобы иметь возможность выполнять несколько приложений, а также несколько копий одного и того же приложения в одном и том же процессе.
Это функция, встречающаяся на других языках сценариев (например, TCL) и особенно полезная для разработчиков gui, веб-серверов и т.д.
Он разбивается на python, потому что многие расширения не являются безопасными несколькими интерпретаторами, поэтому одно действие интерпретатора может влиять на переменные в другом интерпретаторе.