Какие основные инструменты для многопроцессорности предоставляет Python?

Ответ

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

Ключевые компоненты multiprocessing:

1. Класс Process Создает и управляет отдельным процессом. Аналогичен threading.Thread.

from multiprocessing import Process
import os

def info(title):
    print(title)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

if __name__ == '__main__':
    p = Process(target=info, args=('Функция info',))
    p.start()
    p.join()

2. Класс Pool Управляет пулом рабочих процессов, что удобно для распараллеливания выполнения функции на наборе данных (задачи в стиле map-reduce).

from multiprocessing import Pool

def square(x):
    return x * x

if __name__ == '__main__':
    # Создаем пул из 4 процессов
    with Pool(processes=4) as pool:
        # Распределяем вычисления по процессам
        results = pool.map(square, range(10))
        print(results)

3. Средства межпроцессного взаимодействия (IPC) Поскольку процессы не разделяют память, для обмена данными нужны специальные механизмы:

  • Queue: Процессно-безопасная очередь (FIFO).
  • Pipe: Двусторонний канал связи между двумя процессами.

Пример с Queue:

from multiprocessing import Process, Queue

def worker(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=worker, args=(q,))
    p.start()
    print(q.get()) # Блокируется до получения данных
    p.join()

4. Разделяемая память Для обмена простыми данными без сериализации можно использовать:

  • Value: Разделяемый объект для одного значения (например, c_int, c_double).
  • Array: Разделяемый массив фиксированного размера и типа.