Построив значительную часть своего кода на укропной сериализации/мариновании, я также пытаюсь использовать пафосную многопроцессорность для распараллеливания своих вычислений. Пафос это естественное продолжение укропа.
При попытке запустить вложенный
from pathos.multiprocessing import ProcessingPool
ProcessingPool().map(fn, args)
внутри другого ProcessingPool().map
, то я получаю:
AssertionError: daemonic processes are not allowed to have children
E.g.:
from pathos.multiprocessing import ProcessingPool
def triple(x):
return 3*x
def refork(x):
from pathos.multiprocessing import ProcessingPool
return ProcessingPool().map(triple, xrange(5))
ProcessingPool().map(refork, xrange(3))
урожаи
AssertionError: daemonic processes are not allowed to have children
Я пытался использовать amap(...).get()
безуспешно. Это на пафосной 0.2.0.
Каков наилучший способ разрешить вложенное распараллеливание?
Обновить
Я должен быть честным в этом месте, и признаться, что я удалил утверждение "daemonic processes are not allowed to have children"
из пафоса. Я также построил что-то, что каскадирует KeyboardInterrupt
для рабочих и рабочих из тех... Части решения ниже:
def run_parallel(exec_func, exec_args, num_workers_i)
pool = ProcessingPool(num_workers_i)
pool.restart(force=True)
pid_is = pool.map(get_pid_i, xrange(num_workers_i))
try:
results = pool.amap(
exec_func,
exec_args,
)
counter_i = 0
while not results.ready():
sleep(2)
if counter_i % 60 == 0:
print('Waiting for children running in pool.amap() with PIDs: {}'.format(pid_is))
counter_i += 1
results = results.get()
pool.close()
pool.join()
except KeyboardInterrupt:
print('Ctrl+C received, attempting to terminate pool...')
hard_kill_pool(pid_is, pool) # sending Ctrl+C
raise
except:
print('Attempting to close parallel after exception: {}'.format(sys.exc_info()[0]))
cls.hard_kill_pool(pid_is, pool) # sending Ctrl+C
raise
def hard_kill_pool(pid_is, pool):
for pid_i in pid_is:
os.kill(pid_i, signal.SIGINT) # sending Ctrl+C
pool.terminate()
Кажется, работает с консоли и ноутбука IPython (с кнопкой остановки), но не уверен, что это на 100% правильно во всех крайних случаях.
pathos
автор. Причина, по которой у вас не может быть процессов, порождающих процессы, заключается в том, что они не умирают должным образом, и у вас есть процессы-зомби, которые в конечном итоге зависнут. Я бы порекомендовал решение @Yoda, так как это типичный случай… один дорогой параллельный блок и несколько легких параллельных битов работы.pathos
также имеетParallelPool
, который медленнее, но работает, если вам нужно что-то кроме потоков. Я бы также посоветовал поэкспериментировать с неблокирующими картами, так как блокировка может замедлить вас. Также см.: stackoverflow.com/questions/28203774 - person Mike McKerns   schedule 28.11.2016amap
, но по другой причинеCtrl+C
не вытащил меня изmap
. К сожалению, не могу использовать облегченный трюк, так как это уже была более крупная система на момент поиска пафоса (после укропа). Теперь следующая задача - иметь какую-то общую память (чтение и запись всех процессов), что кажется сложным с использованием моего каскадного решения... Кстати, отличный инструмент, спасибо! - person Mark Horvath   schedule 29.11.2016ThreadingPool
илиParallelPool
) для обеспечения вложенного параллелизма и потребует иерархииProcessingPools
… но, возможно, у вас есть допустимый вариант использования. Я не думал об этом и был бы не против узнать об этом больше (может быть, в виде билета на страницеpathos
github). Да, удалив утверждение, вложенныеProcessingPools
должны работать. Однако причина утверждения заключается в том, что вложенные порожденные пулы, как правило, живут как зомби. Уничтожение процессов-зомби с использованием их идентификатора задания является обходным путем. - person Mike McKerns   schedule 29.11.2016ParallelPool
на самом деле выглядит идеально! Прямо сейчас код может просто разветвлять новые процессы везде, где ему нужно (после проверки достаточности ресурсов). Я мог бы построить диспетчер как сервер на основе сокетов, который принимал бы на выполнение маринованные задания. Ничего невозможного, просто нужен рефакторинг. Спасибо! - person Mark Horvath   schedule 30.11.2016