Multiprocessing в Python: как работает многопроцессорность и зачем нужен Pool

    Команда Simple-Server
    03.06.2026
    6 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Что такое многопроцессорность и зачем она нужна?

    Многопроцессорность — это способ организации параллельных вычислений, основанная на одновременном выполнении нескольких изолированных процессов. В отличие от потоков, которые совместно используют память и ресурсы родительского процесса, каждый процесс функционирует в собственном независимом адресном пространстве. Эта изоляция является критически важной, так как она полностью обходит ограничения, налагаемые GIL. В результате многопроцессорная архитектура становится идеальным решением для полномасштабного задействования всех ядер современного центрального процессора, где на каждое ядро может быть назначен отдельный процесс для решения самостоятельной задачи.

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

    Принцип работы модуля показан в следующем примере:

    import multiprocessing import time def worker_function(number): print(f"Процесс {number} запущен") time.sleep(2) print(f"Процесс {number} завершен") return number * 2 if __name__ == "__main__": processes = [] # Создаем и запускаем процессы for i in range(4): process = multiprocessing.Process( target=worker_function, args=(i,) ) processes.append(process) process.start() # Ожидаем завершения всех процессов for process in processes: process.join() print("Все процессы завершены")

    В этом примере метод pool.map() принимает функцию и итерируемый объект, автоматически распределяя задачи по процессам и собирая результаты выполнения.

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

    • Технология эффективно распределяет вычислительную нагрузку между всеми доступными ядрами центрального процессора, обеспечивая полную утилизацию его ресурсов.

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

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

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

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

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

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

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

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

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

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

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

    Введение в Pool: управление пулом процессов

    Ручное создание и координация множества процессов представляют собой сложную и трудоемкую задачу. Эффективным решением этой проблемы является использование класса Pool (пул процессов). Его принцип работы заключается в предварительном создании фиксированного числа рабочих процессов (в количестве, равном числу ядер CPU по умолчанию), которые затем автоматически распределяют поступающие задачи и агрегируют полученные результаты. Этот подход не только упрощает реализацию параллельных вычислений, но и минимизирует издержки, связанные с постоянным порождением и завершением процессов.

    • Автоматическое управление. Pool сам распределяет задачи и переиспользует процессы.

    • Эффективное распределение задач. Pool автоматически распределяет переданные ему задачи по свободным рабочим процессам. Как только один процесс завершает свою часть работы, он сразу получает следующую задачу из очереди.

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

    Автоматическое управление. Pool сам распределяет задачи и переиспользует процессы.

    Эффективное распределение задач. Pool автоматически распределяет переданные ему задачи по свободным рабочим процессам. Как только один процесс завершает свою часть работы, он сразу получает следующую задачу из очереди.

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

    Пример использования Pool

    Предположим, нам нужно вычислить квадраты чисел от 1 до 10 параллельно:

    import multiprocessing def square(x): return x * x if __name__ == "__main__": # Пул из 4 процессов with multiprocessing.Pool(processes=4) as pool: results = pool.map(square, range(1, 11)) print(results)

    Результат выполнения кода:

    Функция pool.map() распределяет задачи (числа от 1 до 10). Если задач больше, чем процессов, Pool перераспределит их по мере завершения.

    Перепишем код выше для асинхронного выполнения:

    import multiprocessing import time def square(x): time.sleep(1) return x * x if __name__ == "__main__": with multiprocessing.Pool() as pool: async_result = pool.map_async(square, range(1, 6)) print("Ожидание результатов...") results = async_result.get() print(results)

    Результат выполнения кода:

    Этот фрагмент кода реализует асинхронную модель выполнения. Ее ключевое преимущество заключается в том, что управление возвращается в основной поток немедленно после инициирования фоновых задач, в отличие от синхронного подхода, рассмотренного ранее, где главный поток блокировался вплоть до окончания всех вычислений. Такая архитектура обеспечивает конкурентность, позволяя основной программе продолжать работу параллельно с выполнением операций в дочерних процессах.

    Класс Pool из модуля multiprocessing оптимально подходит для решения задач, которым требуется значительное использование мощностей процессора (вычислительно сложных операций). Его основное назначение — распараллеливание нагрузки с целью полной загрузки вычислительных ядер процессора. Типичные сценарии использования включают:

    • Выполнение сложных математических операций и алгоритмов.

    • Пакетная обработка и трансформация больших объемов данных (Big Data).

    • Массовая параллельная обработка элементов итерируемых объектов (списков, массивов).

    Выполнение сложных математических операций и алгоритмов.

    Пакетная обработка и трансформация больших объемов данных (Big Data).

    Массовая параллельная обработка элементов итерируемых объектов (списков, массивов).


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны