Ответ
Субинтерпретаторы (Subinterpreters) в Python — это механизм, позволяющий запускать несколько изолированных экземпляров интерпретатора Python в рамках одного процесса.
Основная цель их введения — достижение истинного параллелизма для CPU-bound задач путем обхода ограничений глобальной блокировки интерпретатора (GIL), поскольку каждый субинтерпретатор имеет свой собственный GIL.
Ключевые особенности
- Изоляция GIL: Каждый субинтерпретатор имеет свою собственную блокировку GIL, что позволяет коду в разных субинтерпретаторах выполняться по-настоящему параллельно на многоядерных процессорах.
- Изоляция состояния: Объекты и глобальные переменные не разделяются между субинтерпретаторами, что предотвращает гонки данных, но усложняет взаимодействие.
- Обмен данными: Взаимодействие между ними возможно только через специальные каналы (channels), что обеспечивает безопасность.
Пример использования (экспериментальный API)
# Модуль является экспериментальным и может измениться
import _xxsubinterpreters as subinterpreters
import textwrap
# Создаем новый субинтерпретатор
interp_id = subinterpreters.create()
# Код для выполнения в новом интерпретаторе
code = textwrap.dedent("""
import threading
print(f"Hello from subinterpreter! Thread ID: {threading.get_ident()}")
""")
# Запускаем код в созданном субинтерпретаторе
subinterpreters.run_string(interp_id, code)
# Уничтожаем субинтерпретатор для освобождения ресурсов
subinterpreters.destroy(interp_id)
На данный момент (Python 3.12) API для работы с субинтерпретаторами все еще считается нестабильным и не предназначен для использования в production. Однако работа над ним активно ведется, и в будущем он может стать стандартным способом для параллельных вычислений в Python.