Я пишу программу для обработки multiprocessing.Queue
несколькими параллельными процессами. Чем больше я копаю в оркестровой части, тем меньше я понимаю.как организовать процессы в многопроцессорной обработке?
Я хочу достичь, чтобы начать несколько процессов и убедиться, что все они выполнены, прежде чем идти дальше. Это звучит как работа для .join()
.
Я закончил тем, что тестирование следующего демо-скрипта (работал на Linux):
import multiprocessing
import time
def myproc():
print("hello from {proc}".format(proc=multiprocessing.current_process()))
time.sleep(5)
allproc = []
for _ in range(3):
p = multiprocessing.Process(target=myproc)
allproc.append(p)
p.start()
print("all processes started")
for p in allproc:
print("joining {proc}".format(proc=p))
p.join()
print("the end")
То, что я ожидал, чтобы иметь функцию начала три раза, немедленно напечатать сообщение «привет», а затем спать. После того, как все они спят, окончательное сообщение («конец») печатается.
То, что я на самом деле получить это:
hello from <Process(Process-1, started)>
hello from <Process(Process-2, started)>
all processes started
joining <Process(Process-1, started)>
hello from <Process(Process-3, started)>
joining <Process(Process-2, stopped)>
joining <Process(Process-3, stopped)>
the end
При запуске сценария, он ждет от 3-го «привет» и второй «присоединение».
Как мне создать многопроцессорный код, чтобы я мог достичь ожидаемой оркестровки, как описано выше?
Кажется, все в порядке. Это то, что, как я считаю, происходит: основной поток достигает линии соединения до того, как третий процесс успеет распечатать свое сообщение, чем он висит. К тому времени третий процесс печатает свои вещи и ждет. Процесс завершается так, что основной поток может перейти на второй процесс, но два уже завершены. Затем он переходит к третьему процессу, но этот парень тоже делается (обратите внимание на «остановленный» статус в обоих случаях). Затем основной процесс покидает посылку. –
Я имел в виду «помещение». Вздох ... –