Добавить в корзинуПозвонить
Найти в Дзене
CODERIKK

🔹 GIL: почему Python блокирует потоки (и что с этим делать

) 🔹 Что такое GIL и как он влияет на threading и parallelism? 🔸 GIL (Global Interpreter Lock) появился, чтобы защитить внутреннее состояние CPython — в основном простая реализация счётчика ссылок и структуры объектов. Без GIL пришлось бы тонко синхронизировать доступ на C‑уровне, что сильно усложнило бы реализацию интерпретатора. 🔸 GIL сериализует выполнение байт-кода, поэтому в CPU‑bound (CPU — Central Processing Unit) задачах потоки (threading) в CPython не дают настоящего параллелизма. Для IO (Input/Output) потоков выигрыш остаётся полезным. multiprocessing создаёт отдельные процессы, обходит GIL и даёт настоящий parallelism, но стоит дороже по памяти и IPC. 🔸 Практика: для сетевых/дисковых задач — threading или async; для тяжёлых вычислений — multiprocessing или C/NumPy-библиотеки без GIL. Минимальный пример запуска двух воркеров: def worker(n): s=0 for i in range(n): s+=i print(s) from threading import Thread t1=Thread(target=worker, args=(10_000_000,)) t2=Thread(target=

🔹 GIL: почему Python блокирует потоки (и что с этим делать)

🔹 Что такое GIL и как он влияет на threading и parallelism?

🔸 GIL (Global Interpreter Lock) появился, чтобы защитить внутреннее состояние CPython — в основном простая реализация счётчика ссылок и структуры объектов. Без GIL пришлось бы тонко синхронизировать доступ на C‑уровне, что сильно усложнило бы реализацию интерпретатора.

🔸 GIL сериализует выполнение байт-кода, поэтому в CPU‑bound (CPU — Central Processing Unit) задачах потоки (threading) в CPython не дают настоящего параллелизма. Для IO (Input/Output) потоков выигрыш остаётся полезным. multiprocessing создаёт отдельные процессы, обходит GIL и даёт настоящий parallelism, но стоит дороже по памяти и IPC.

🔸 Практика: для сетевых/дисковых задач — threading или async; для тяжёлых вычислений — multiprocessing или C/NumPy-библиотеки без GIL. Минимальный пример запуска двух воркеров:

def worker(n):

s=0

for i in range(n):

s+=i

print(s)

from threading import Thread

t1=Thread(target=worker, args=(10_000_000,))

t2=Thread(target=worker, args=(10_000_000,))

t1.start(); t2.start(); t1.join(); t2.join()

from multiprocessing import Process

p1=Process(target=worker, args=(10_000_000,))

p2=Process(target=worker, args=(10_000_000,))

p1.start(); p2.start(); p1.join(); p2.join()

📚 Итог: GIL упрощает интерпретатор, мешает CPU‑параллелизму — выбирайте инструмент по характеру нагрузки.

#CODERIKK #Python #Senior

➡️ Мы в Telegram - Сетке - ВК

Буду рад вашей реакции здесь⬇️