import multiprocessing
def worker():
print("Привет из нового процесса!")
if __name__ == '__main__':
p = multiprocessing.Process(target=worker)
p.start()
p.join()
Для создания нового процесса с помощью библиотеки multiprocessing
в Python, обычно используют класс Process
. Вот основные шаги и пример кода:
multiprocessing
: Это даст вам доступ к необходимым функциям и классам.Process
: При создании экземпляра Process
, укажите функцию, которую он должен выполнить, используя аргумент target
. Вы также можете передать аргументы в эту функцию, используя аргумент args
, который должен быть кортежем.start()
для запуска процесса. Это создаст новый процесс и запустит функцию, указанную в target
.join()
, чтобы текущий процесс ожидал завершения созданного процесса. Это может быть полезно, если вам нужно дождаться завершения работы нового процесса перед продолжением выполнения основной программы.Вот пример кода, иллюстрирующий этот процесс:
import multiprocessing
import time
def worker(num):
"""Функция, выполняющаяся в отдельном процессе."""
print(f"Процесс {num} начал работу")
time.sleep(2) # Имитация длительной операции
print(f"Процесс {num} завершил работу")
if __name__ == '__main__':
# Важно: код, использующий multiprocessing, должен быть защищен блоком if __name__ == '__main__':
# чтобы избежать рекурсивного запуска новых процессов при импорте модуля в Windows.
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("Все процессы завершены")
Важные моменты:
if __name__ == '__main__':
: В Windows, при использовании multiprocessing
, важно заключить код, создающий и запускающий процессы, в блок if __name__ == '__main__':
. Это предотвращает рекурсивный импорт модуля и бесконечное создание новых процессов. В Linux и macOS это обычно не требуется, но все равно является хорошей практикой.multiprocessing
предоставляет механизмы для безопасной передачи данных между процессами, такие как Queue
и Pipe
. Если вам нужно передавать данные, используйте их вместо общих переменных, чтобы избежать проблем с синхронизацией.Lock
), чтобы избежать состояния гонки и обеспечить корректную работу программы.Этот подход позволяет эффективно использовать многоядерные процессоры и ускорить выполнение задач, которые можно распараллелить.