Spec-Zone.ru › Python 3.13

Экспериментальная поддержка Python для работы без GIL

Начиная с выпуска 3.13, CPython экспериментально поддерживает сборку Python, называемую свободной многопоточностью, в которой отключена глобальная блокировка интерпретатора (GIL). Выполнение без GIL позволяет полностью использовать доступные вычислительные ресурсы, запуская потоки параллельно на доступных ядрах ЦП. Хотя не всё программное обеспечение автоматически получит от этого пользу, программы, спроектированные с учётом многопоточности, будут работать быстрее на многоядерном оборудовании.

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

В этом документе описаны последствия использования режима без GIL для кода Python. Информацию о написании расширений C, поддерживающих сборку без GIL, см. в разделе Поддержка C API для работы без GIL.

См. также

PEP 703 — «Сделать глобальную блокировку интерпретатора необязательной в CPython»: общее описание Python без GIL.

Установка

Начиная с Python 3.13, официальные установщики для macOS и Windows позволяют при необходимости установить двоичные файлы Python без GIL. Установщики доступны по адресу https://www.python.org/downloads/.

Информацию о других платформах см. в руководстве Установка Python без GIL — руководстве по установке Python без GIL, которое поддерживается сообществом.

При сборке CPython из исходного кода для сборки интерпретатора Python без GIL следует использовать параметр конфигурации --disable-gil.

Определение Python без GIL

Чтобы проверить, поддерживает ли текущий интерпретатор работу без GIL, посмотрите, содержат ли python -VV и sys.version строку «experimental free-threading build». Новую функцию sys._is_gil_enabled() можно использовать, чтобы проверить, действительно ли GIL отключена в работающем процессе.

Переменную конфигурации sysconfig.get_config_var("Py_GIL_DISABLED") можно использовать, чтобы определить, поддерживает ли сборка работу без GIL. Если переменной присвоено значение 1, сборка поддерживает работу без GIL. Это рекомендуемый способ принимать решения, связанные с конфигурацией сборки.

Глобальная блокировка интерпретатора в Python без GIL

Сборки CPython без GIL позволяют включать GIL во время выполнения с помощью переменной окружения PYTHON_GIL или параметра командной строки -X gil.

Кроме того, GIL может включаться автоматически при импорте модуля расширения C API, который явно не помечен как поддерживающий работу без GIL. В этом случае будет выведено предупреждение.

Помимо документации отдельных пакетов, на следующих веб-сайтах отслеживается состояние поддержки работы без GIL в популярных пакетах:

  • https://py-free-threading.github.io/tracking/
  • https://hugovk.github.io/free-threaded-wheels/

Потокобезопасность

Сборка CPython без GIL призвана обеспечить на уровне Python поведение, аналогичное поведению сборки по умолчанию с включённой GIL, с точки зрения потокобезопасности. Встроенные типы, такие как dict, list и set, используют внутренние блокировки для защиты от одновременных изменений; их поведение аналогично поведению GIL. Однако Python исторически не гарантировал определённого поведения при одновременном изменении этих встроенных типов, поэтому это описание следует считать характеристикой текущей реализации, а не гарантией текущего или будущего поведения.

Примечание

По возможности рекомендуется использовать threading.Lock или другие примитивы синхронизации вместо того, чтобы полагаться на внутренние блокировки встроенных типов.

Известные ограничения

В этом разделе описаны известные ограничения сборки CPython без GIL.

Объекты с бессрочным временем жизни

В сборке без GIL выпуска 3.13 некоторые объекты становятся бессмертными. Бессмертные объекты не освобождаются, а их счётчики ссылок никогда не изменяются. Это сделано, чтобы избежать конкуренции при обновлении счётчиков ссылок, которая мешала бы эффективному масштабированию при многопоточном выполнении.

Объект становится бессмертным при первом запуске нового потока после начала работы главного потока. Бессмертными становятся следующие объекты:

  • функции, объявленные на уровне модуля
  • дескрипторы методов
  • объекты кода
  • объекты модулей и их словари
  • классы (объекты типа)

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

Кроме того, бессмертными становятся числовые и строковые литералы в коде, а также строки, возвращаемые функцией sys.intern(). Ожидается, что такое поведение сохранится в сборке без GIL выпуска 3.14.

Объекты кадров стека

Обращаться к объектам кадров стека из других потоков небезопасно: это может привести к аварийному завершению программы. Поэтому sys._current_frames() обычно небезопасно использовать в сборке без GIL. Такие функции, как inspect.currentframe() и sys._getframe(), в целом безопасны, если полученный объект кадра стека не передаётся в другой поток.

Итераторы

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

Производительность в однопоточном режиме

При выполнении кода Python сборка без GIL создаёт дополнительные накладные расходы по сравнению со сборкой по умолчанию с включённой GIL. В версии 3.13 эти накладные расходы составляют около 40% при запуске набора тестов pyperformance. Программы, которые проводят большую часть времени в расширениях C или выполняя операции ввода-вывода, пострадают меньше. Наибольшее влияние связано с тем, что в сборке без GIL отключён специализирующийся адаптивный интерпретатор (PEP 659). Мы рассчитываем вновь включить его в выпуске 3.14, обеспечив потокобезопасность. Ожидается, что в следующих выпусках Python эти накладные расходы уменьшатся. Наша цель — добиться накладных расходов не более 10% на наборе тестов pyperformance по сравнению со сборкой по умолчанию с включённой GIL.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/howto/free-threading-python.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API