Перевел прод на Python 3.14 free-threaded и через две недели откатился. Рассказываю где больно
Рейтинг: 0% · 0 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
Перевел прод на Python 3.14 free-threaded и через две недели откатился. Рассказываю где больно
Расскажу как я сходил в светлое безгильное будущее и вернулся обратно. Сервис: парсинг фидов поставщиков плюс ресайз картинок, крутился на 12 процессах через multiprocessing, жрал 9 гигов, потому что каждый процесс тащит свою копию всего на свете. Решил что пора: ставлю 3.14t (uv python install 3.14t, кстати, работает из коробки), переписываю пул процессов на ThreadPoolExecutor, общие структуры вместо Manager. На бумаге красота.
Теперь реальность.
1. Однопоток просел процентов на 8. Это известно и обещано (5-10%), но все равно неприятно.
2. Половина зависимостей без колес под cp314t. psycopg2 собирал из исходников, одна либа для exif так и не собралась, выкинул.
3. Самое смешное. Если хоть одно C-расширение не объявило поддержку free-threading, интерпретатор молча включает GIL обратно. Узнал я это через sys._is_gil_enabled() спустя ДВЕ НЕДЕЛИ. То есть я гонял free-threaded сборку с включенным гилом и радовался, что ничего не падает.
4. Выпилил виновника, гил реально выключился. И начались сегфолты раз в 4-6 часов где-то в C-кишках либы для ресайза. Под нагрузкой, естественно, в три ночи.
Откатился на 3.13 и multiprocessing, сплю спокойно. Вернусь к этой теме году в 2027. У кого-нибудь реально взлетело в проде?
Теперь реальность.
1. Однопоток просел процентов на 8. Это известно и обещано (5-10%), но все равно неприятно.
2. Половина зависимостей без колес под cp314t. psycopg2 собирал из исходников, одна либа для exif так и не собралась, выкинул.
3. Самое смешное. Если хоть одно C-расширение не объявило поддержку free-threading, интерпретатор молча включает GIL обратно. Узнал я это через sys._is_gil_enabled() спустя ДВЕ НЕДЕЛИ. То есть я гонял free-threaded сборку с включенным гилом и радовался, что ничего не падает.
4. Выпилил виновника, гил реально выключился. И начались сегфолты раз в 4-6 часов где-то в C-кишках либы для ресайза. Под нагрузкой, естественно, в три ночи.
Откатился на 3.13 и multiprocessing, сплю спокойно. Вернусь к этой теме году в 2027. У кого-нибудь реально взлетело в проде?
✔ Лучший ответ сформирован автоматически — zfsguru
У нас взлетело, но мы шли к этому полгода. ML-препроцессинг, чистый CPU-bound, 16 потоков. На обычном 3.13 скейлинг по потокам х1 (спасибо гилу), на 3.14t получили х9. Но: выпилили все сомнительные зависимости, numpy свежий (free-threading там нормально живет уже с 2.1), все свое нативное пересобрали и прогнали под TSan. Вот последнее прям обязательно, гонки в расширениях, которые годами молча пр…
Re: Перевел прод на Python 3.14 free-threaded и через две недели откатился. Рассказываю где больно
ворнинг при старте оно вообще-то пишет, что гил включен обратно и из-за какого модуля. stderr читать не пробовал? хах. а по делу: ставь PYTHON_GIL=0 жестко, тогда несовместимое расширение упадет прямо на импорте и ты узнаешь сразу, а не через две недели
Re: Перевел прод на Python 3.14 free-threaded и через две недели откатился. Рассказываю где больно
✔ Лучший ответ — сформирован автоматически
У нас взлетело, но мы шли к этому полгода. ML-препроцессинг, чистый CPU-bound, 16 потоков. На обычном 3.13 скейлинг по потокам х1 (спасибо гилу), на 3.14t получили х9. Но: выпилили все сомнительные зависимости, numpy свежий (free-threading там нормально живет уже с 2.1), все свое нативное пересобрали и прогнали под TSan. Вот последнее прям обязательно, гонки в расширениях, которые годами молча прятались за гилом, вылезают именно так, как у тебя: сегфолт раз в несколько часов. Это не Python сломан, это твоя либа всегда была сломана, просто раньше ей не давали исполняться параллельно.
И да, для типичного веба это все пока мимо. Наш кейс узкий: числодробилка, где память общая и копировать ее в процессы дорого.
И да, для типичного веба это все пока мимо. Наш кейс узкий: числодробилка, где память общая и копировать ее в процессы дорого.
Re: Перевел прод на Python 3.14 free-threaded и через две недели откатился. Рассказываю где больно
Про subinterpreters кто-нибудь вспомнит или я один? В 3.14 же завезли concurrent.interpreters прямо в stdlib. Изоляция как у процессов, оверхед сильно меньше, гил у каждого свой. Для кейса ТС (независимые задачи, мало общего состояния) выглядит честнее, чем free-threading со всеми его сегфолтами. Сам пока гонял только на игрушечных примерах, врать не буду.
- fandango1305
- Сообщения: 8
- Зарегистрирован: 30 май 2026, 15:36
Re: Перевел прод на Python 3.14 free-threaded и через две недели откатился. Рассказываю где больно
Подтверждаю что нативные биндинги это главная боль. У нас свои на pybind11, поддержку free-threaded режима там завезли еще в 2.13, но просто перекомпилировать мало: пришлось руками расставлять локи вокруг всего, что трогает общее состояние. Зато теперь х14 на 16 ядрах и один процесс вместо зоопарка. Окупилось, но у нас это месяц работы одного человека.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- iOS 26: перевёл апп на Liquid Glass — половина кнопок не читается на фоне фоток
10 ответов · 1217 просмотров
-
- Кто реально гонял Python 3.13t free-threaded? У меня одиночный поток просел на 40%
7 ответов · 633 просмотров
-
- Перевели монорепу на TypeScript 7 (tsgo): типчек с 3 минут до 15 секунд, делюсь граблями
4 ответов · 17 просмотров
-
- Перевёл монорепу на tsgo (нативный TypeScript): тайпчек с 78 секунд до 9, но есть нюансы
5 ответов · 16 просмотров
-
- Месяц на free-threaded Python 3.14 в проде: разбор выписок ускорился в 5 раз, но граблей хватает
5 ответов · 12 просмотров
-
- Chronos и TimesFM против CatBoost: кто-то реально перевел прогноз спроса на foundation-модели?
5 ответов · 11 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя