Ответ
Модуль multiprocessing
в Python используется для создания и управления процессами, что позволяет выполнять код параллельно на нескольких ядрах CPU. Его использование имеет как сильные стороны, так и компромиссы.
Преимущества
-
Обход GIL (Global Interpreter Lock) Каждый процесс имеет свой собственный интерпретатор Python и, следовательно, свой GIL. Это позволяет по-настоящему параллельно выполнять CPU-bound задачи (например, сложные математические вычисления, обработка изображений) и полностью утилизировать многоядерные процессоры.
-
Изоляция памяти и отказоустойчивость Процессы не разделяют память по умолчанию. Ошибка или сбой в одном дочернем процессе не повлияет на основной процесс или другие дочерние процессы, что делает приложение более стабильным и надежным.
Недостатки
-
Высокие накладные расходы Создание нового процесса — ресурсоемкая операция, требующая больше времени и памяти по сравнению с созданием потока (
threading
). -
Сложность межпроцессного взаимодействия (IPC) Поскольку память изолирована, для обмена данными между процессами необходимо использовать специальные механизмы, такие как
Queue
,Pipe
илиShared Memory
, что усложняет код.
Пример: Параллельное выполнение CPU-bound задачи
import time
from multiprocessing import Process, cpu_count
def heavy_calculation(n):
"""Имитация тяжелой вычислительной задачи"""
start_time = time.time()
result = sum(i * i for i in range(n))
duration = time.time() - start_time
print(f"Задача с n={n} завершена за {duration:.2f}с. Результат: {result}")
if __name__ == '__main__':
# Используем количество доступных ядер CPU
num_processes = cpu_count()
print(f"Запуск {num_processes} процессов...")
processes = []
for i in range(num_processes):
# Создаем процесс для выполнения задачи
p = Process(target=heavy_calculation, args=(10**7,))
processes.append(p)
p.start()
# Ожидаем завершения всех процессов
for p in processes:
p.join()
print("Все процессы завершены.")