Что такое GIL и как с ним жить
Вопрос
Что такое GIL, на что он влияет и как вы обходите его ограничения?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Один поток выполняет байткод в момент времени, ради подсчёта ссылок
I/O-bound: потоки работают, GIL отпускается при ожидании
CPU-bound: процессы, C-расширения, векторизация
GIL не защищает от гонок в пользовательском коде
asyncio для большого числа соединений
Free-threaded сборка 3.13/3.14 существует, но не по умолчанию
Что могут спросить следом
- Будет ли гонка при
x += 1из двух потоков? - Как передать большие данные между процессами без копирования?
- Почему бы просто не убрать GIL?
Разбор
Образцовый ответ: «GIL это глобальная блокировка интерпретатора CPython: в каждый момент байткод выполняет только один поток процесса. Нужна она в первую очередь из-за подсчёта ссылок: без неё каждое изменение счётчика пришлось бы защищать. Практические следствия такие. Для I/O-bound задач, запросов к сети и базе, потоки работают нормально, потому что при блокирующем ожидании GIL отпускается. Для CPU-bound кода на чистом Python потоки не ускоряют, и я беру ProcessPoolExecutor, где у каждого процесса свой интерпретатор и свой GIL, или переношу горячий код в numpy или расширение, которое отпускает GIL. Если соединений тысячи, беру asyncio, потому что поток на соединение дорог. Важно: GIL не делает код потокобезопасным, counter += 1 из нескольких потоков может терять обновления, нужен Lock. И новое: в 3.13 появилась экспериментальная сборка без GIL, в 3.14 её официально поддерживают, но по умолчанию CPython пока с GIL, и библиотеки на C только адаптируются».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.