Встречается на собеседованиях • сегодня

Зачем GIL блокирует потоки

GIL (Global Interpreter Lock) — это механизм в CPython, который предотвращает одновременное выполнение байт-кода несколькими потоками. Он существует из-за особенностей управления памятью в CPython (например, подсчёт ссылок) и упрощает интеграцию C-расширений.

Основные причины:

  • Безопасность памяти: GIL защищает структуры данных интерпретатора от гонки потоков.
  • Производительность: В однопоточных сценариях GIL снижает накладные расходы на блокировки.
  • C-расширения: Многие библиотеки (например, NumPy) полагаются на GIL для корректной работы.

Пример проблемы без GIL:

python
# Без GIL это могло бы привести к race condition
counter = 0

def increment():
    global counter
    for _ in range(100000):
        counter += 1

threads = [Thread(target=increment) for _ in range(10)]
for t in threads:
    t.start()
for t in threads:
    t.join()
print(counter)  # Может быть меньше 1_000_000 из-за гонки данных

Когда GIL мешает:

  • В CPU-bound задачах (вычислениях), где потоки не могут работать параллельно. Решение: multiprocessing или асинхронность.
  • В IO-bound задачах GIL часто освобождается (например, при операциях с сетью), поэтому потоки всё равно полезны.

Альтернативы: Jython, IronPython (без GIL), но они менее популярны.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы