2016-11-06 3 views
0

Я новичок в многопроцессорности Python, и я пытаюсь реализовать некоторые параллельные вычисления. У меня есть информация, что это:Python Multiprocessing - процессы Parrallel

#M is an integer, contains the number of processes I'd like to launch. 
results = [] 
for i in range(0, M): 
     p = Process(target=processchild, args=(data[i],q)) 
     p.start() 
     result.append(q.get()) 
     p.join() 

еще последовательный, поскольку .join() вызывает цикл ждать, пока p не будет закончен до начала следующего. Я прочитал в ответ here, что

Вы либо хотите присоединиться к вашим процессам по отдельности вне вашего для цикла (например, путем сохранения их в виде списка, а затем итерации над ним) ...

Так, если бы я изменить мой код

results = [] 
for i in range(0, M): 
     processes[i] = Process(target=processchild, args=(data[i],q)) 
     processes[i].start() 
     result.append(q.get()) 

for i in range(0, M): 
     processes[i].join() 

ли он на самом деле работать параллельно сейчас? Если нет, как я могу изменить свой код для работы таким образом? Я прочитал решение, используя numpy.Pool и apply_async, отправленный как ответ на вопрос, который я ранее связал, поэтому меня больше всего интересует решение, которое их не использует.

+0

звучит правильно. Вы должны проверить с помощью системных инструментов, что процессы 'M' фактически выполняются одновременно. –

ответ

0

Да, это будет работать параллельно.

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

+1

нет, 'q.get' wiil block – robyschek

+0

@robyschek Могу ли я добавить q.get() во второй цикл после' join() '? Будет ли это означать правильную параллельную работу? –

+1

@lte__ Да, это правильный путь. – robyschek