Как механизмы взаимодействия потоков и GIL влияют на параллельное выполнение кода в Python?
Ответ от нейросети
sobes.tech AI
В Python существует механизм GIL (Global Interpreter Lock) — глобальная блокировка интерпретатора, которая позволяет одновременно исполнять байт-код Python только в одном потоке. Это означает, что даже если у вас несколько потоков, они не смогут одновременно выполнять Python-код параллельно на нескольких ядрах процессора.
Потоки в Python полезны для задач ввода-вывода (например, сетевые операции, чтение файлов), где поток может ожидать завершения операции, освобождая GIL для других потоков. Но для CPU-интенсивных задач многопоточность не даст прироста производительности из-за GIL.
Для настоящей параллельной обработки CPU-интенсивных задач в Python обычно используют модуль multiprocessing, который запускает несколько процессов, каждый со своим интерпретатором и памятью, обходя ограничение GIL.
Пример использования потоков для I/O:
import threading
import time
def io_task():
time.sleep(1) # имитация операции ввода-вывода
print("I/O задача завершена")
threads = [threading.Thread(target=io_task) for _ in range(5)]
for t in threads:
t.start()
for t in threads:
t.join()
Для CPU-задач лучше multiprocessing:
from multiprocessing import Pool
def cpu_task(x):
return x * x
with Pool(4) as p:
print(p.map(cpu_task, range(10)))