Цей пост від творця Python, Гвідо Ван Россума, згадує про ранню спробу видалити GIL з Python:
Це було випробувано раніше, із невтішними результатами, тому я неохоче докладаю багато зусиль до цього. У 1999 р. Грег Штейн (разом з Марком Хаммонд?) Виготовив виделку Python (1.5 я вважаю), що видалила GIL, замінивши його дрібнозернистими замками на всіх змінних структурах даних. Він також представив виправлення, які видалили багато спільнот глобальних змінних структур даних, які я прийняв. Однак після тестування було показано, що навіть на платформі з найшвидшим блокуванням примітиву (на той час Windows) він уповільнив однопотокове виконання майже вдвічі, що означає, що на двох процесорах ви можете отримати трохи більше роботи зроблено без GIL, ніж на одному процесорі з GIL. Цього було недостатньо, і пластир Грега відпав у небуття. (Дивіться опис Грега щодо виступу.)
Я навряд чи можу посперечатися з фактичними результатами, але мені справді цікаво, чому це сталося. Імовірно, головна причина того, що видалити GIL з CPython настільки складно, це через систему управління пам'яттю підрахунку посилань. Типова програма Python буде викликати Py_INCREF
і Py_DECREF
тисячі або мільйони разів, що робить його ключовий момент конкуруючого якщо ми повинні були обернути пасма навколо нього.
Але я не розумію, чому додавання атомних примітивів сповільнить одну програму з потоком. Припустимо, ми просто змінили CPython, щоб змінна refcount у кожному об'єкті Python була атомним примітивом. І тоді ми просто робимо атомний приріст (інструкція добування та додавання), коли нам потрібно збільшити кількість відліку. Це зробило б посилання підрахунку потоку Python безпечним і не повинно бути штрафом щодо продуктивності для однопотокового додатку, оскільки не буде суперечки щодо блокування.
Але, на жаль, багато людей, які розумніші за мене, пробували і не вдавались, тому явно щось тут мені не вистачає. Що не так у тому, як я дивлюся на цю проблему?