Для чего используется класс multiprocessing.Process в Python и как с ним работать?

Ответ

Класс multiprocessing.Process в Python используется для создания и управления дочерними процессами. Его основная цель — выполнение CPU-bound задач (интенсивных вычислений) в параллельном режиме, что позволяет обойти ограничение Global Interpreter Lock (GIL) и эффективно использовать все ядра процессора.

В отличие от потоков (threading.Thread), которые выполняются в рамках одного процесса и разделяют одну память (и GIL), каждый Process имеет собственное адресное пространство и свой экземпляр интерпретатора Python.

Базовый пример использования:

import multiprocessing
import time

def worker(name):
    """Функция, которая будет выполняться в дочернем процессе."""
    print(f'Процесс {name} запущен.')
    time.sleep(2)
    print(f'Процесс {name} завершен.')

if __name__ == '__main__':
    # Создание объекта процесса
    p = multiprocessing.Process(target=worker, args=('Worker-1',))

    # Запуск процесса
    p.start()

    print('Основной процесс продолжает работу.')

    # Ожидание завершения дочернего процесса
    p.join()

    print('Дочерний процесс завершился, основной процесс закончен.')

Ключевые особенности и правила:

  • if __name__ == '__main__':: Эта конструкция обязательна в Windows и рекомендуется во всех ОС. Она предотвращает рекурсивное создание дочерних процессов при импорте модуля.
  • target и args: В конструктор Process передается целевая функция (target) и кортеж ее аргументов (args).
  • start(): Метод запускает выполнение функции в новом процессе.
  • join(): Метод блокирует выполнение основного процесса до тех пор, пока дочерний процесс не завершится. Это необходимо для синхронизации.
  • Межпроцессное взаимодействие (IPC): Поскольку процессы изолированы, для обмена данными между ними используются специальные механизмы, такие как Queue, Pipe или Manager из модуля multiprocessing.