我正在从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运行这些功能时,它们会按预期快速运行(在'运行'状态为20个核心的~100%cpu)。但是,有时如果我在第一次运行它后立即重新运行parallel_predict
函数,所有20个进程都会被无条件地标记为不间断睡眠(D)状态。我没有写任何东西到磁盘,只是将输出作为iPython笔记本中的变量。
作为最后的尝试,我尝试在del p
之后加入p.join()
并且这有点帮助(函数正常运行),但我仍然偶尔会遇到进程为D的问题,尤其是如果队列中有很多进程。
修改
通常,在del p
之后添加p.join()
会使进程无法进入(D)状态,但我仍然遇到函数将完成所有进程的问题(据我所知)来自top
),但它不会返回结果。当我停止iPython Notebook内核时,我收到了错误ZMQError: Address already in use
。
我应该如何正确启动或完成多处理池以防止这种情况发生?
答案 0 :(得分:0)
我改变了四件事,现在1)流程不再进入(D)状态,2)我可以背靠背地运行这些功能,他们总是返回结果并且不会挂起。
要parallel_predict
,我添加了freeze_support()
并将p.close()
替换为p.terminate()
(并添加了print
行,但我不认为有所作为,但我包括,因为所有这些都是迷信无论如何)。我还添加了del p
。
def parallel_predict(subjects, conditions):
freeze_support()
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.terminate()
p.join()
del p
print "finished"
return ans
最后,我在parallel_predict
中嵌入了if __name__ == "__main__"
所在的行:
if __name__ == "__main__":
all_results = parallel_predict(subjects,conditions)