Я выполняю большое параллельное вычисление сопоставления из ноутбука iPython. Я сопоставляю кадр данных по предмету и условию с функцией прогнозирования машинного обучения, и я хочу, чтобы каждый предмет и условие были распределены между 20 ядрами.
def map_vars_to_functionPredict(subject,condition):
ans = map(predictBasic, [subject],[df],[condition])
return ans
def main_helperPredict(args):
return map_vars_to_functionPredict(*args)
def parallel_predict(subjects, conditions):
p = Pool(20)
# set each matching item into a tuple
job_args = list(itertools.product(*[subjects,conditions]))
print job_args
# map to pool
ans = p.map(main_helperPredict, job_args)
p.close()
p.join()
return ans
Когда я запускаю эти функции из iPython Notebook после запуска ноутбука, они работают быстро и так, как ожидалось (в состоянии «Работает» при ~ 100% процессоре на 20 ядрах). Однако иногда, если я повторно запускаю функцию parallel_predict
сразу после ее первого запуска, все 20 процессов без причины помечаются как находящиеся в состоянии непрерывного сна (D). Я ничего не пишу на диск, просто получаю результат как переменную в блокноте iPython.
В качестве последней попытки я попытался включить del p
после p.join()
, и это несколько помогло (функция работает нормально чаще), но у меня все еще иногда возникает проблема с процессами D, особенно если у меня много процессов в очереди.
Изменить:
В общем, добавление del p
после p.join()
не позволяло процессам переходить в состояние (D), но у меня по-прежнему была проблема, когда функция завершала все процессы (насколько я мог судить по top
), но не возвращала результатов. Когда я остановил ядро iPython Notebook, я получил ошибку ZMQError: Address already in use
.
Как мне правильно запустить или завершить многопроцессорный пул, чтобы этого не произошло?