Вопрос с собеседования · Python

Что меняет сборка Python без GIL (free-threaded)?

SeniorКонкурентностьPython >=3.13
Ещё спрашивают так:
  • Уберут ли GIL из Python?
  • Что такое PEP 703?
Коротко

Отдельная сборка CPython (python3.13t) без GIL: потоки выполняют Python-код по-настоящему параллельно на разных ядрах. В 3.13 — экспериментальная, в 3.14 — официально поддерживаемая, но не по умолчанию. Цена: медленнее однопоточный код, C-расширения должны объявить совместимость.

  • Подсчёт ссылок стал смещённым и атомарным, аллокатор — mimalloc
  • Расширение без поддержки при импорте снова включает GIL
  • Гонки в пользовательском коде никуда не делись — блокировки нужны

А ещё Для вычислений в потоках выигрыш почти линейный по ядрам

Подробно

Зачем. GIL не даёт потокам выполнять Python-код параллельно, поэтому вычисления распараллеливали процессами — с ценой pickle и памяти. Особенно мешало это в ML и научных расчётах.

Как устроено без GIL:

  • смещённый подсчёт ссылок — поток-владелец объекта меняет счётчик без атомарных операций, остальные — атомарно;
  • бессмертные объекты (None, малые числа) не считают ссылки вовсе;
  • встроенные коллекции защищены мелкими блокировками на объект;
  • аллокатор mimalloc, потокобезопасный.

Цена: однопоточный код медленнее (в 3.13 — до 40%, в 3.14 — около 5–10%), памяти больше. C-расширения должны быть пересобраны и помечены как безопасные; иначе интерпретатор при их импорте возвращает GIL.

Статус: 3.13 — экспериментальная сборка (PEP 703); 3.14 — признана поддерживаемой (PEP 779), но стандартная сборка по-прежнему с GIL. Решение о переходе по умолчанию — позже.

Для разработчика: код, полагавшийся на «атомарность благодаря GIL», может сломаться; блокировки и очереди — обязательны.

Что хотят услышать

  • Что даёт отсутствие GIL.
  • Технические изменения: подсчёт ссылок, блокировки коллекций.
  • Цена и статус по версиям.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗В Python 3.13 GIL удалён во всех сборках по умолчанию, поэтому блокировки в многопоточном коде больше не нужны
  • ✓Отдельная сборка: потоки выполняют Python-код параллельно, но однопоточный код медленнее
  • ✗Free-threaded сборка ускоряет однопоточный код
  • ✗Без GIL C-расширения работают без доработок

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования