Python 3.9 без GIL. Что дальше?
Об очередной попытке избавиться от глобальной блокировки интерпретатора.
На заметку
Если вы ещё не знакомы с ГБИ (GIL) — глобальной блокировкой интерпретатора — полезно будет посмотреть старое, но актуальное видео «Познавая ГБИ (GIL) Питона».
В дайджесте 03.10.2021 — 10.10.2021 внимательные читатели могли заметить упоминание темы «Python multithreading without the GIL» в разделе «Разработка языка». О чём это?
7 октября Сэм Гросс выступил с предложением обсудить вариант подхода к устранению GIL. Не только выступил, но и опубликовал детальное описание подхода. И не только опубликовал, но и поделился ссылкой на репозиторий, где он применил подход к Python 3.9.
На заметку
Идея избавиться от GIL далеко не нова. Многие об этом говорили и говорят, немногие пытаются, хоть что-то получается у единиц: читайте «Чемпион подустал».
Несомненно стоит отметить основательность, с которой Сэм подошёл к задаче. Судя по комментариям в упомянутом обсуждении, многих разработчиков ядра предложенные подходы заинтересовали.
На днях в ходе спринта разработчиков CPython прошла встреча с Сэмом, о которой пишет Лукаш Ланга в своей статье «Notes From the Meeting On Python GIL Removal Between Python Core and Sam Gross».
Кратко об изменениях:
- замена текущего варианта подсчёта ссылок «пристрастным», позволяющим нитям по-разному обходиться с объектом, в зависимости от того был он порождён в этой нити или в другой;
- введение понятия «бессмертных» объектов (например, для
None
, булевых значений, мелких целых, интернированных строк), для которых не требуется подсчёт ссылок; - использование механизма отложенного подсчёта ссылок для глобальных, но «смертных» объектов, типа модулей, функций, объектов кода. Чтобы занесение их на стек не изменяло счётчик, а деаллоцировались они только при сборке мусора;
- замена аллокатора
pymalloc
наmimalloc
, обеспечивающий безопасную работу с нитями и лёгковесные «кучи»; - замена стековой виртуальной машины регистровой для ускорения вызовов функций.
Получившаяся версия 3.9 без ГБИ работает на 10% быстрее оригинала. Если же применить все упомянутые изменения, то получается прирост в 19% относительно немодифицированного 3.9.
На заметку
В готовящийся Python 3.11 уже внесены правки, благодаря которым он сейчас на 16% быстрее (при работе в одной нити), чем реализация Сэма.
Что ясно уже сейчас:
- Невозможно определить, сколько составит конкретно ваш выигрыш при использовании реализации без GIL без замеров на реальном коде.
- Предлагаемые изменения хорошо показывают себя вместе. По-отдельности могут снижать быстродействие.
- Авторам расширений на Си, если они захотят получить выигрыш, нужно будет адаптировать расширения. Предполагается, что потребуется продолжительный период адаптации, в котором блокировку можно будет отключать/включать по требованию.
- Проект с подинтерпретаторами может потерять свою актуальность.
- Не стоит ожидать, что 3.11 выйдет уже без ГБИ. Но, быть может,
mimalloc
использовать получится.
Изменения масштабные, задача сложная. Путь обещает быть неблизким, если по нему пойдут.
Категории
Область
Интерпретатор
Аспект языка
На заметку
Читайте нас в Twitter. Ссылка в самом низу страницы.