Что такое многопроцессность в Python?

Многопроцессность в Python позволяет запускать несколько Python процессов параллельно, используя возможности многоядерных процессоров. Это обходит Global Interpreter Lock (GIL) и обеспечивает реальный параллелизм для задач, интенсивно использующих процессор (CPU-bound), таких как математические вычисления или обработка данных. Для реализации используют модуль multiprocessing, который позволяет создавать и управлять процессами, а также обмениваться данными между ними.

Многопроцессность в Python – это техника параллельного выполнения кода, при которой программа запускает несколько отдельных процессов операционной системы, каждый из которых имеет собственное адресное пространство и собственный интерпретатор Python. Это позволяет эффективно использовать многоядерные процессоры и обходить ограничение GIL (Global Interpreter Lock), которое препятствует истинному параллелизму в многопоточных программах Python.

Основные характеристики и преимущества многопроцессности:

  • Истинный параллелизм: Каждый процесс выполняется независимо на отдельном ядре процессора, что обеспечивает существенное ускорение для задач, интенсивно использующих CPU (например, научные вычисления, обработка изображений).
  • Обход GIL: Поскольку каждый процесс имеет свой собственный интерпретатор Python, GIL не является проблемой. Разные процессы могут выполнять Python-код параллельно без взаимной блокировки.
  • Изоляция: Процессы изолированы друг от друга. Если один процесс завершится с ошибкой, это не повлияет на другие процессы.
  • Более ресурсоемкая: Создание и управление процессами требует больше ресурсов (память, CPU) по сравнению с потоками. Переключение между процессами также медленнее, чем переключение между потоками.

Основные модули Python для многопроцессности:

  • multiprocessing: Основной модуль для создания и управления процессами. Предоставляет инструменты для создания процессов, организации обмена данными между ними (очереди, пайпы, разделяемая память) и синхронизации.
  • concurrent.futures: Предоставляет высокоуровневый интерфейс для асинхронного выполнения задач с использованием пула процессов (ProcessPoolExecutor) или пула потоков (ThreadPoolExecutor). Упрощает написание параллельного кода.

Когда использовать многопроцессность:

  • Задачи, требующие интенсивных вычислений (CPU-bound).
  • Задачи, которые можно разбить на независимые подзадачи.
  • Когда необходимо обойти ограничение GIL для достижения параллелизма.
  • Когда важна изоляция процессов и устойчивость к ошибкам.

Пример использования (упрощенный):


  import multiprocessing
  import time

  def worker(num):
      print(f"Process {num}: Starting")
      time.sleep(2)  # Имитация выполнения задачи
      print(f"Process {num}: Finishing")

  if __name__ == '__main__':
      processes = []
      for i in range(3):
          p = multiprocessing.Process(target=worker, args=(i,))
          processes.append(p)
          p.start()

      for p in processes:
          p.join()  # Дождаться завершения всех процессов

      print("All processes finished")
  

В этом примере создаются три отдельных процесса, каждый из которых выполняет функцию worker. p.join() обеспечивает, что основная программа будет ждать завершения всех дочерних процессов, прежде чем продолжить выполнение.

0