GIL (глобальная блокировка интерпретатора) в Python работает так: позволяет только одному потоку выполнять Python-код в конкретный момент времени, чтобы не дать двум и более потокам одновременно получить доступ к важным объектам. 13
Когда один поток захватывает GIL, механизм блокирует все остальные потоки и запрещает им работать, пока тот поток не освободит GIL. 1 Когда GIL свободен, его может захватить любой поток — как именно и в каком порядке, зависит от логики. 1
На практике это может выглядеть так: программа создаёт четыре потока, каждый из которых получает задание увеличить переменную x на единицу. 1 Поток 0 захватывает GIL и начинает работу с переменной. 1 На этом этапе только этот поток выполняет Python-код. 1 Поток 0 видит, что x = 0, увеличивает значение и освобождает GIL. 1 Теперь x = 1. 1 Поток 1 захватывает GIL и начинает работу с переменной. 1 На этом этапе только этот поток выполняет Python-код. 1 Поток 1 видит, что x = 1, увеличивает значение и освобождает GIL. 1 Теперь x = 2. 1 Поток 4 захватывает GIL и начинает работу с переменной. 1 На этом этапе только этот поток выполняет Python-код. 1
GIL ограничивает производительность многопоточных программ, но упрощает управление памятью, повышает потокобезопасность и облегчает разработку CPython. 3