Вопрос проверяет понимание различий между моделями параллелизма — процессами и потоками, а также ограничений интерпретатора Python (GIL) и выбора подходящей модели для CPU- или IO-задач.
Многопроцессность использует несколько независимых процессов, каждый со своей памятью, что позволяет выполнять код параллельно на разных ядрах CPU.
Многопоточность использует несколько потоков внутри одного процесса, но они разделяют память и в CPython ограничены GIL — только один поток выполняет Python-байткод в момент времени.
Процессы подходят для CPU-интенсивных задач, где важна настоящая параллельность. Потоки удобны для IO-операций (файлы, сеть), где основная часть времени — ожидание.
Выбор между ними зависит от характера задачи: CPU → процессы, IO → потоки.
Понимание многопроцессности и многопоточности важно для правильного выбора модели параллелизма в Python.
Определение:Многопроцессность — выполнение программы несколькими независимыми процессами, каждый из которых имеет собственное адресное пространство и выполняется параллельно на разных ядрах.
Определение:Многопоточность — выполнение программы несколькими потоками внутри одного процесса, использующими общую память и ресурсы.
процессы изолированы;
потоки делят общую память → нужны блокировки (Lock, RLock).
процессы работают параллельно на нескольких ядрах;
потоки в CPython выполняются по очереди из-за GIL (но могут параллелить IO).
процессы тяжелее: запуск дольше, межпроцессное взаимодействие сложнее (Queue, Pipe);
потоки лёгкие и быстрые, но сложнее для безопасной работы с общей памятью.
CPU-heavy задачи:
обработка изображений,
машинное обучение,
криптография
→ многопроцессность (multiprocessing).
IO-heavy задачи:
сетевые вызовы,
работа с файлами,
ожидание API
→ многопоточность (threading).
from multiprocessing import Pool
def calc(x):
return x * x
with Pool(4) as p:
print(p.map(calc, range(10)))
import threading
import time
def task():
time.sleep(1)
threads = [threading.Thread(target=task) for _ in range(5)]
for t in threads: t.start()
for t in threads: t.join()
Многопроцессность даёт настоящую параллельность.
Многопоточность эффективна для IO-запросов.
В CPython GIL ограничивает потоки, но не влияет на процессы.
Выбор зависит от характера нагрузки