Каковы преимущества и недостатки модуля multiprocessing в Python

Ответ

Модуль 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("Все процессы завершены.")