Что такое субинтерпретаторы в Python и зачем они нужны

Ответ

Субинтерпретаторы (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.