Добавить в корзинуПозвонить
Найти в Дзене

Демонстрация скорости работы в многопоточном режиме "Python 3.13" на обычной сборке и на сборке «Free-threaded» (с видео)

Начиная с версии "Python 3.13" вводится различие между дистрибутивами пайтона по режиму многопоточности. Они могут иметь разницу "по типу сборки" и быть: Описание этих терминов смотри в конце статьи в разделе "Для справки" Соответственно, если мы пишем приложение с учетом использования многопоточности в пайтоне, делим задачи на "потоки" и запускаем их на выполнение "параллельно", то для нормального (именно "параллельного"!) выполнения этих "потоков", у нас (и у клиента!!!) должна стоять сборка пайтона с включенным режимом "free-threaded". Как это обеспечить? Приведем пример установки двух вариантов VENV пайтона одной и той же версии "3.13", но разных сборок, одна "free-threaded", вторая "GIL". Примечание: команды приводятся в расчете на то, что у вас уже установлен менеджер питона "UV". Если у вас его нет, советую просто установить его. Информацию читайте тут: https://dzen.ru/suite/0abca9da-f91a-44f1-9595-ccf93d899712 Для начала установим через "UV" две версии пайтона с номерами "3.1
  • Статья предназначена для технических специалистов, занимающихся программированием на Python!

Начиная с версии "Python 3.13" вводится различие между дистрибутивами пайтона по режиму многопоточности. Они могут иметь разницу "по типу сборки" и быть:

  • с включенным "GIL"
  • с включенным "free-threaded"
Описание этих терминов смотри в конце статьи в разделе "Для справки"

Соответственно, если мы пишем приложение с учетом использования многопоточности в пайтоне, делим задачи на "потоки" и запускаем их на выполнение "параллельно", то для нормального (именно "параллельного"!) выполнения этих "потоков", у нас (и у клиента!!!) должна стоять сборка пайтона с включенным режимом "free-threaded".

Как это обеспечить?

Приведем пример установки двух вариантов VENV пайтона одной и той же версии "3.13", но разных сборок, одна "free-threaded", вторая "GIL".

Примечание: команды приводятся в расчете на то, что у вас уже установлен менеджер питона "UV". Если у вас его нет, советую просто установить его. Информацию читайте тут: https://dzen.ru/suite/0abca9da-f91a-44f1-9595-ccf93d899712

Для начала установим через "UV" две версии пайтона с номерами "3.13" но разных сборок, "GIL" и "free-threaded". Делается это командами:

  • uv python list - выдаст список имеющихся версий python
  1. uv python install 3.13.3+freethreaded
  2. uv python install 3.13.3

Команда под пунктом "1" установит многопоточную версию
Команда под пунктом "2" установит обычную версию

Они в файловой системе различаются по названию папки, в которую они устанавливаются:

-2

Теперь создадим два новых пустых каталога:

  • c:\1
  • c:\2

В папке "c:\1" создадим "venv" командой:

  • uv venv --python 3.13.3+freethreaded

В папке "c:\2" создадим "venv" командой:

  • uv venv --python 3.13.3

Мы будем знать, что в папке "1" у нас стоит многопоточная версия пайтона, а в папке "2" однопоточная.

Скачаем тестовый файл примера тут: >>> Файл примера кода <<<

Вот его код:

Код файла примера теста многопоточности пайтона
Код файла примера теста многопоточности пайтона

Посмотреть ( и скопировать) код можно тут:

thread_timers.py

Скачанный файл будем запускать на обеих версиях пайтона, и на однопоточной, и на многопоточной.

  • c:\1\.venv\scripts\python thread_timers.py - мнгопоточный запуск
  • c:\2\.venv\scripts\python thread_timers.py - однопоточный запуск

Видео теста запуска этого скрипта одновременно в двух терминалах на разных "сборках" пайтона:

Тот же ролик на RuTube:

Пример выполнения одной и той же задачи на "GIL" сборке пайтона и на "Ftee Thread"

Как видим, этот пример наглядно показывает, что код, написанный в режиме "многопоточности" на обычной "GIL"-сборке просто эмулируется, а сами потоки выполняются в однопоточном режиме "по очереди", отсюда и общее увеличение длительности всего цикла примерно в 2,4 раза по сравнению с реальной многопоточностью, где каждый из запущенных потоков выполняется параллельно другому, а не последовательно один за другим.

Именно в этом и состоит разница между разными "сборками" одного и того же номера версии "Python".

Мой пример запускает только ДВА потока параллельно, а насколько увеличится скорость выполнения PY-скрипта при разбивке его на ДЕСЯТКИ потоков?

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

Вопрос:

  • как же тогда распространять свои программы, написанные в режиме "multithread" вместе с "multithread" версией "Python"?

Вот ответ:

  • указанием именно "thread" версии пайтона в установочном скрипте

Думаю, нет проблем - написать бат-файл с указанной в нем ссылкой на нужную версию пайтона. Подробнее об этом читай тут:

Для справки:

Что такое GIL и зачем его убирать?

  • Global Interpreter Lock (GIL) — это механизм в CPython (стандартной реализации Python), который разрешает выполнение только одного потока Python за раз, даже на многоядерных CPU. Это упрощает работу с памятью и делает CPython потокобезопасным, но убивает параллелизм в CPU-bound задачах.
  • В классическом Python (например, 3.12) потоки эффективны только для I/O-bound задач (сеть, файлы), но для вычислений они выполняются последовательно.

Особенности free-threaded Python

  1. Без GIL:
    Потоки могут работать параллельно, используя все ядра CPU. Например, математические расчеты в нескольких потоках ускорятся пропорционально числу ядер.
  2. Экспериментальный статус:
    На момент 2023–2024 годов free-threaded версия — это не официальный релиз, а
    отдельные сборки (например, проект "nogil" Сэма Гросса). Часть этих изменений планируется интегрировать в будущие версии Python (как опциональный режим).
  3. Совместимость:
    Код, написанный для CPython с GIL, чаще всего будет работать и в free-threaded версии, но
    могут возникнуть проблемы:
    C-расширения, не учитывающие многопоточность, могут ломаться.
    Требуется аккуратная работа с разделяемыми данными (нужны явные блокировки/семафоры).
Обложка статьи
Обложка статьи

Удачи!