Об очередной попытке избавиться от глобальной блокировки интерпретатора.
На заметку
Если вы ещё не знакомы с ГБИ (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. Ссылка в самом низу страницы.