2016-12-01 9 views
0

Мне нужно создать скрипт, который в каком-то состоянии порождает параллельный процесс (рабочий) и заставляет его выполнять какое-то задание ввода-вывода. И когда он закончит - закройте этот процесс. Но похоже, что процессы не имеют тенденций к выходу по умолчанию.Создайте несколько параллельных процессов и убейте их после финиша

Вот мой подход:

import multiprocessing 

pool = multiprocessing.Pool(4) 

def f(x):       
    sleep(10) 
    print(x) 
    return True 

r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10]) 

Но я запускаю его в IPython и whait для всех отпечатков, после этого я могу запустить пс Окс | grep ipython и увидеть много процессов. Похоже, эти рабочие все еще живы.

Возможно, я что-то не так, но как я могу заставить эти процессы прекратить работу, когда они закончат свою задачу? И какой подход я должен использовать, если я хочу, чтобы создать много рабочих один за другим (например, получив некоторое сообщение rmq)?

+0

Почему вы передаете 'None' для объединения? Разве это не количество процессов, которые вы собираетесь использовать? – roganjosh

+0

Да, спасибо! Исправлено, изменений нет. – Paul

ответ

1

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

Если вы измените код:

r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10]) 
pool.close() 
pool.join() 
print "check ps ax now" 
sleep (10) 

вы увидите пул исчезли процессы.

Другое дело, что ваша программа может работать не так, как вы заявляете функцию f после объявления вашего пула. Мне пришлось изменить pool = multiprocessing.Pool (4), чтобы следовать объявлению функции f, но это может варьироваться в зависимости от версий Python. В любом случае, если вы получаете нечетные значения «модуль не имеет атрибута», это и есть причина.

Hannu

+0

Да, я получил это исключение, поэтому я переместил декларацию пула. Благодаря! Является ли этот подход подходящим для повторного запуска процессов один за другим асинхронно? – Paul

+0

Процессы создаются уже при пуле = multiprocessing.Pool (4). Для их запуска не требуется map_async или любая другая команда отправки задания. Идея пула состоит в том, чтобы процессы были готовы обрабатывать любые задачи, которые вы решили их кормить, а процессы прекращаются только при закрытии пула и обработке последних задач. Использование map_async в том, как вы его используете для обработки списка данных, полностью прекрасен. Именно так оно и должно использоваться. – Hannu

+0

спасибо! :) Я задал еще один вопрос: http://stackoverflow.com/questions/40913207/return-value-from-spawned-multiprocessing-process Возможно, вас это заинтересует. :) – Paul

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

  • Нет связанных вопросов^_^