Этот вопрос проверяет, понимаете ли вы ограничения многопоточности в CPython и зачем вообще существует GIL.
GIL — это механизм в CPython, который разрешает выполнять байткод Python только одному потоку одновременно. Его главная задача — упростить работу с памятью и сделать внутренности интерпретатора безопаснее. Благодаря этому многие операции с объектами Python не требуют сложной синхронизации. Минус в том, что потоки не ускоряют CPU-тяжелые задачи в CPython.
Чтобы корректно обсуждать потоки в Python, важно уточнить: речь обычно про реализацию CPython, где GIL — ключевая деталь.
Определение: GIL (Global Interpreter Lock) — глобальная блокировка, из-за которой в CPython в один момент времени только один поток может выполнять байткод Python.
Смысл не в том, чтобы “запретить потоки”, а в том, чтобы упростить безопасную работу интерпретатора.
Упрощение управления памятью
В CPython есть подсчет ссылок: объект удаляется, когда на него больше никто не ссылается.
Без GIL пришлось бы защищать многие операции над ссылками тонкой синхронизацией.
Безопасность внутренних структур интерпретатора
Множество частей CPython рассчитаны на то, что параллельно их не меняют два потока.
Производительность на типичных сценариях
GIL — компромисс: проще реализация и часто быстрее на реальных задачах, чем “везде блокировки”.
Перед перечислением важно зафиксировать практический эффект: GIL влияет в основном на CPU-bound задачи.
CPU-тяжелое в потоках обычно не ускоряется
Например, вычисления в чистом Python в нескольких потоках чаще всего не дадут прироста.
I/O-задачи в потоках часто выигрывают
Ожидание сети/диска позволяет интерпретатору отдавать выполнение другим потокам.
Часть кода может обходить ограничение
Некоторые C-расширения временно “отпускают” GIL во время тяжелых вычислений.
import threading
def work():
x = 0
for _ in range(10_000_00):
x += 1
t1 = threading.Thread(target=work)
t2 = threading.Thread(target=work)
t1.start(); t2.start()
t1.join(); t2.join()
# В CPython это обычно не будет в 2 раза быстрее
GIL нужен, чтобы сделать CPython проще и безопаснее внутри, но он ограничивает параллельное выполнение байткода; для CPU-тяжелых задач чаще выбирают процессы, а для ожидания I/O потоки подходят хорошо.