Документация Python неофициальный перевод

free-threading-python.md

83 строк · 13.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.13/howto/free-threading-python.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Экспериментальная поддержка свободной многопоточности в Python89Начиная с версии 3.13, в CPython появилась экспериментальная поддержка сборки Python, называемой [свободной многопоточностью](https://python-all.ru/3.13/glossary.html#term-free-threading), в которой отключён [глобальная блокировка интерпретатора](https://python-all.ru/3.13/glossary.html#term-global-interpreter-lock) (GIL). Выполнение в режиме свободной многопоточности позволяет полностью использовать доступную вычислительную мощность, запуская потоки параллельно на доступных ядрах CPU. Хотя не всё программное обеспечение выиграет от этого автоматически, программы, спроектированные с учётом многопоточности, будут работать быстрее на многоядерном оборудовании.1011**Режим свободной многопоточности является экспериментальным**, и работа по его улучшению продолжается: ожидайте некоторые ошибки и существенное снижение производительности в однопоточном режиме.1213В этом документе описываются последствия свободной многопоточности для Python-кода. Информацию о том, как писать расширения на C, поддерживающие сборку со свободной многопоточностью, см. в [C API Extension Support for Free Threading](https://python-all.ru/3.13/howto/free-threading-extensions.html#freethreading-extensions-howto).1415> **См. также**16>17> [**PEP 703**](https://python-all.ru/3.13/howto/free-threading-python.html) – «Сделать глобальную блокировку интерпретатора опциональной в CPython» для общего описания Python со свободной многопоточностью.1819## Установка2021Начиная с Python 3.13, официальные установщики для macOS и Windows опционально поддерживают установку двоичных файлов Python со свободной многопоточностью. Установщики доступны по адресу [https://www.python.org/downloads/](https://python-all.ru/3.13/howto/free-threading-python.html).2223Информацию о других платформах см. в [Installing a Free-Threaded Python](https://python-all.ru/3.13/howto/free-threading-python.html), руководстве по установке, поддерживаемом сообществом, для установки Python со свободной многопоточностью.2425При сборке CPython из исходного кода для создания свободно-поточной сборки интерпретатора Python следует использовать опцию конфигурации [`--disable-gil`](https://python-all.ru/3.13/using/configure.html#cmdoption-disable-gil).2627## Определение сборки со свободной потоковой обработкой2829Чтобы проверить, поддерживает ли текущий интерпретатор работу без GIL, [`python -VV`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-V) и [`sys.version`](https://python-all.ru/3.13/library/sys.html#sys.version) содержат «experimental free-threading build». Новая функция [`sys._is_gil_enabled()`](https://python-all.ru/3.13/library/sys.html#sys._is_gil_enabled) позволяет проверить, действительно ли GIL отключен в текущем процессе.3031Переменная конфигурации `sysconfig.get_config_var("Py_GIL_DISABLED")` позволяет определить, поддерживает ли сборка свободную потоковую обработку. Если переменная имеет значение `1`, то сборка поддерживает свободную потоковую обработку. Это рекомендуемый механизм для принятия решений, связанных с конфигурацией сборки.3233## Глобальная блокировка интерпретатора в сборке со свободной потоковой обработкой3435Сборки CPython со свободной потоковой обработкой поддерживают опциональную работу с включённой GIL во время выполнения с помощью переменной окружения [`PYTHON_GIL`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHON_GIL) или опции командной строки [`-X gil`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-X).3637GIL также может автоматически включаться при импорте модуля расширения C-API, который явно не помечен как поддерживающий свободную потоковую обработку. В этом случае будет выведено предупреждение.3839В дополнение к документации отдельных пакетов, следующие сайты отслеживают статус поддержки свободной потоковой обработки популярными пакетами:4041- [https://py-free-threading.github.io/tracking/](https://python-all.ru/3.13/howto/free-threading-python.html)42- [https://hugovk.github.io/free-threaded-wheels/](https://python-all.ru/3.13/howto/free-threading-python.html)4344## Потокобезопасность4546Сборка CPython со свободной потоковой обработкой стремится обеспечить на уровне Python поведение, аналогичное потокобезопасности сборки со включённой GIL по умолчанию. Встроенные типы, такие как [`dict`](https://python-all.ru/3.13/library/stdtypes.html#dict), [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) и [`set`](https://python-all.ru/3.13/library/stdtypes.html#set), используют внутренние блокировки для защиты от одновременных изменений подобно GIL. Однако исторически Python не гарантировал конкретного поведения при одновременных изменениях этих встроенных типов, поэтому это следует рассматривать как описание текущей реализации, а не как гарантию текущего или будущего поведения.4748> **Примечание**49>50> По возможности рекомендуется использовать [`threading.Lock`](https://python-all.ru/3.13/library/threading.html#threading.Lock) или другие примитивы синхронизации вместо того, чтобы полагаться на внутренние блокировки встроенных типов.5152## Известные ограничения5354В этом разделе описаны известные ограничения сборки CPython со свободной потоковой обработкой.5556### Иммортализация5758Сборка со свободной многопоточностью в версии 3.13 делает некоторые объекты [бессмертными](https://python-all.ru/3.13/glossary.html#term-immortal). Бессмертные объекты не освобождаются и имеют счётчики ссылок, которые никогда не изменяются. Это сделано для предотвращения конкуренции за счётчик ссылок, которая могла бы помешать эффективному масштабированию многопоточности.5960Объект становится бессмертным при первом запуске нового потока после того, как главный поток уже работает. Следующие объекты становятся бессмертными:6162- [function](https://python-all.ru/3.13/reference/datamodel.html#user-defined-funcs) объекты, объявленные на уровне модуля63- [method](https://python-all.ru/3.13/reference/datamodel.html#instance-methods) дескрипторы64- [code](https://python-all.ru/3.13/reference/datamodel.html#code-objects) объекты65- [module](https://python-all.ru/3.13/glossary.html#term-module) объекты и их словари66- [classes](https://python-all.ru/3.13/reference/datamodel.html#classes) (объекты типа)6768Поскольку бессмертные объекты никогда не освобождаются, приложения, создающие много объектов этих типов, могут заметить увеличение использования памяти. Ожидается, что это будет исправлено в версии 3.14.6970Кроме того, числовые и строковые литералы в коде, а также строки, возвращаемые [`sys.intern()`](https://python-all.ru/3.13/library/sys.html#sys.intern), также становятся бессмертными. Ожидается, что это поведение сохранится в сборке со свободной многопоточностью 3.14.7172### Объекты фреймов7374Небезопасно обращаться к объектам [frame](https://python-all.ru/3.13/reference/datamodel.html#frame-objects) из других потоков, и это может привести к аварийному завершению программы. Это означает, что [`sys._current_frames()`](https://python-all.ru/3.13/library/sys.html#sys._current_frames) в целом небезопасно использовать в сборке со свободной многопоточностью. Функции вроде [`inspect.currentframe()`](https://python-all.ru/3.13/library/inspect.html#inspect.currentframe) и [`sys._getframe()`](https://python-all.ru/3.13/library/sys.html#sys._getframe) в целом безопасны, если результирующий объект frame не передаётся другому потоку.7576### Итераторы7778Совместное использование одного и того же объекта итератора между несколькими потоками в целом небезопасно: потоки могут видеть дублирующиеся или пропущенные элементы при итерации или привести к аварийному завершению интерпретатора.7980### Производительность в однопоточном режиме8182Сборка со свободной многопоточностью имеет дополнительные накладные расходы при выполнении кода Python по сравнению со стандартной сборкой с включённым GIL. В версии 3.13 эти накладные расходы составляют около 40% по набору тестов [pyperformance](https://python-all.ru/3.13/howto/free-threading-python.html). Программы, которые большую часть времени проводят в расширениях C или операциях ввода-вывода, увидят меньшее влияние. Наибольшее влияние связано с тем, что специализирующий адаптивный интерпретатор ([**PEP 659**](https://python-all.ru/3.13/howto/free-threading-python.html)) отключён в сборке со свободной многопоточностью. Мы ожидаем, что включим его снова потокобезопасным способом в версии 3.14. Ожидается, что эти накладные расходы будут уменьшены в будущих версиях Python. Мы стремимся к накладным расходам 10% или менее по набору pyperformance по сравнению со стандартной сборкой с GIL.83