В этом посте от создателя Python, Гвидо Ван Россума, упоминается ранняя попытка удалить GIL из Python:
Это было опробовано ранее, и результаты оказались неутешительными, поэтому я не хотел бы приложить к этому много усилий сам. В 1999 году Грег Стейн (вместе с Марком Хэммондом?) Выпустил форк Python (я полагаю, 1.5), который удалил GIL, заменив его мелкозернистыми блокировками на всех изменяемых структурах данных. Он также представил патчи, которые убрали многие из опор глобальных изменяемых структур данных, которые я принял. Однако после сравнительного анализа было показано, что даже на платформе с самым быстрым блокирующим примитивом (в то время Windows) он замедлял однопоточное выполнение почти в два раза, а это означает, что на двух процессорах вы можете получить чуть больше работы сделано без GIL, чем на одном процессоре с GIL. Этого было недостаточно, и патч Грега исчез в забвении. (См. Рецензию Грега на представление.)
Я не могу спорить с реальными результатами, но мне действительно интересно, почему это произошло. Предположительно, главная причина, по которой удаление GIL из CPython является настолько сложной, заключается в системе управления памятью подсчета ссылок. Типичная программа Python будет вызывать Py_INCREF
и Py_DECREF
тысячи или миллионы раз, что делает его ключевой момент конкурирующего если мы должны были обернуть пряди вокруг него.
Но я не понимаю , почему добавление атомных примитивов бы замедлить единую резьбовую программу. Предположим, мы только что изменили CPython, чтобы переменная refcount в каждом объекте Python была атомарным примитивом. И тогда мы просто делаем атомарный инкремент (инструкция извлечения и добавления), когда нам нужно увеличить счетчик ссылок. Это сделало бы подсчет ссылок на Python безопасным для потока и не привело бы к снижению производительности однопоточного приложения, поскольку не было бы конфликта блокировок.
Но, увы, многие люди, которые умнее меня, пытались и терпели неудачу, поэтому, очевидно, я что-то здесь упускаю. Что плохого в том, как я смотрю на эту проблему?