Как использовать multiprocessing в Python

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Как использовать multiprocessing в Python: Полный разбор с примерами

Современные вычислительные задачи требуют высокой производительности. Когда речь заходит об ускорении программ на Python, на ум сразу приходят два понятия: многопоточность (multithreading) и многопроцессность (multiprocessing).

Однако стандартная многопоточность в Python часто не даёт желаемого ускорения из-за GIL (Global Interpreter Lock). Именно поэтому для эффективного параллельного выполнения задач часто используют модуль multiprocessing.

В этой статье вы узнаете, что такое multiprocessing, когда его стоит использовать и как применять его на практике.


Что такое multiprocessing в Python?

Модуль multiprocessing позволяет запускать несколько процессов одновременно, используя несколько ядер процессора. Каждый процесс имеет свою собственную память и независимое выполнение, в отличие от потоков, которые работают в рамках одного процесса.

📌 Главное преимущество:
Многопроцессность обходит ограничение GIL, позволяя эффективно использовать многоядерные процессоры для ускорения выполнения задач.


Когда стоит использовать multiprocessing?

  • При работе с CPU-зависимыми задачами: сложные вычисления, обработка изображений, видео, научные расчёты.

  • При необходимости распараллеливания большого объёма данных.

  • Для ускорения итераций тяжёлых циклов.

Если же основная нагрузка связана с вводом-выводом (например, сетевые запросы или работа с файлами), лучше использовать асинхронное программирование или многопоточность.


Базовые понятия и структура работы с multiprocessing

Для работы с multiprocessing необходимо использовать следующие элементы:

  • Process — создание отдельного процесса.

  • Queue — передача данных между процессами.

  • Pool — удобный запуск группы процессов.

  • Lock — управление доступом к ресурсам.


Примеры использования multiprocessing в Python

📚 1. Простой пример с Process

python
import multiprocessing import time def worker(name): print(f"Процесс {name} стартовал") time.sleep(2) print(f"Процесс {name} завершён") if __name__ == "__main__": p1 = multiprocessing.Process(target=worker, args=("A",)) p2 = multiprocessing.Process(target=worker, args=("B",)) p1.start() p2.start() p1.join() p2.join() print("Главный процесс завершён")

Результат:
Оба процесса будут выполняться параллельно, сокращая общее время выполнения.


📚 2. Использование пула процессов (Pool)

Если нужно распараллелить выполнение одной функции с разными аргументами, используйте Pool.

python
import multiprocessing def square(n): return n * n if __name__ == "__main__": with multiprocessing.Pool(processes=4) as pool: results = pool.map(square, [1, 2, 3, 4, 5]) print(results)

Результат:

plaintext
[1, 4, 9, 16, 25]

Процессы работают параллельно, вычисляя квадраты чисел.


📚 3. Передача данных между процессами с помощью Queue

python
import multiprocessing def producer(queue): for i in range(5): queue.put(i) queue.put(None) # Сигнал о завершении def consumer(queue): while True: item = queue.get() if item is None: break print(f"Получено значение: {item}") if __name__ == "__main__": queue = multiprocessing.Queue() p1 = multiprocessing.Process(target=producer, args=(queue,)) p2 = multiprocessing.Process(target=consumer, args=(queue,)) p1.start() p2.start() p1.join() p2.join()

Результат:
Процессы безопасно обмениваются данными через очередь.


📚 4. Использование Lock для синхронизации процессов

Иногда необходимо ограничить одновременный доступ к общим ресурсам.

python
import multiprocessing import time def worker(lock, counter): with lock: print(f"Процесс {multiprocessing.current_process().name} увеличивает счётчик") counter.value += 1 time.sleep(1) if __name__ == "__main__": lock = multiprocessing.Lock() counter = multiprocessing.Value('i', 0) processes = [multiprocessing.Process(target=worker, args=(lock, counter)) for _ in range(5)] for p in processes: p.start() for p in processes: p.join() print(f"Итоговое значение счётчика: {counter.value}")

Результат:
Доступ к переменной counter будет строго контролироваться с помощью блокировок.


Особенности работы с multiprocessing в Windows и Linux

  • На Windows необходимо защищать точку входа в программу через if __name__ == "__main__":, иначе возникнут рекурсивные запуски процессов.

  • На Linux используется форк процессов, что упрощает работу с наследуемыми переменными.

  • При работе с большими объёмами данных стоит учитывать накладные расходы на межпроцессное взаимодействие.


Преимущества и недостатки multiprocessing

Преимущества Недостатки
Использование всех ядер Большие накладные расходы
Обходит GIL Сложнее отлаживать
Эффективно при тяжёлых вычислениях Не всегда подходит для ввода-вывода

Заключение

Модуль multiprocessing — мощный инструмент для ускорения Python-программ, особенно когда речь идёт о CPU-интенсивных задачах. Освоив базовые конструкции, такие как Process, Pool, Queue и Lock, вы сможете писать высокопроизводительные программы, которые эффективно используют ресурсы системы.

При проектировании параллельных решений важно учитывать баланс между сложностью кода и получаемой производительностью. Иногда проще и эффективнее использовать асинхронное программирование или многопоточность, если задачи связаны с вводом-выводом.

Новости