2014-12-05 6 views
1

Я пишу программу для обработки 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-го «привет» и второй «присоединение».

Как мне создать многопроцессорный код, чтобы я мог достичь ожидаемой оркестровки, как описано выше?

+1

Кажется, все в порядке. Это то, что, как я считаю, происходит: основной поток достигает линии соединения до того, как третий процесс успеет распечатать свое сообщение, чем он висит. К тому времени третий процесс печатает свои вещи и ждет. Процесс завершается так, что основной поток может перейти на второй процесс, но два уже завершены. Затем он переходит к третьему процессу, но этот парень тоже делается (обратите внимание на «остановленный» статус в обоих случаях). Затем основной процесс покидает посылку. –

+0

Я имел в виду «помещение». Вздох ... –

ответ

0

Если вы хотите, чтобы основной поток ожидал, что все детские процессы будут выполнены до print("the end"), тогда ваш код будет правильным, согласно объяснению, которое я опубликовал выше. Если вы поместите print len(multiprocessing.active_children()) прямо перед последней строкой кода, вы увидите, что он равен 0.

Смежные вопросы