Глобальная блокировка интерпретатора (GIL) в Python работает следующим образом: habr.com
- Поток, прежде чем захватить GIL, проверяет, удерживает ли её какой-то другой поток. habr.com Если это не так — поток сразу же захватывает GIL. habr.com В противном случае он ждёт до тех пор, пока глобальная блокировка интерпретатора не будет освобождена. habr.com
- Ожидание продолжается в течение фиксированного временного интервала, называемого интервалом переключения (по умолчанию — 5 мс). habr.com Если GIL за это время не освободится, поток устанавливает флаги evalbreaker и gildrop_request. habr.com
- Флаг evalbreaker сообщает потоку, удерживающему GIL, о том, что ему нужно приостановить выполнение байт-кода. habr.com А флаг gildrop_request объясняет ему причину необходимости это сделать. habr.com
- Поток, удерживающий GIL, видит эти флаги, начиная следующую итерацию вычислительного цикла, после чего освобождает GIL. habr.com Он уведомляет об этом потоки, ожидающие освобождения GIL, а потом один из этих потоков захватывает GIL. habr.com Решение о том, какой именно поток нужно разбудить, принимает операционная система, поэтому это может быть тот поток, что установил флаги, а может быть и какой-то другой поток. habr.com
GIL позволяет только одному потоку контролировать интерпретатор Python, то есть в любой момент времени в состоянии выполнения может находиться только один поток. realpython.com pythonist.ru