iPython Notebook 运行 时处于不间断睡眠 (D) 状态的多处理进程
Multiprocessing processes in uninterruptible sleep (D) state when run from iPython Notebook
我正在 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 启动笔记本后,它们 运行 快速且如预期的那样(在 'Running' 状态下 ~100% cpu 在 20 个核心中)。但是,有时如果我在第一次 运行 之后立即重新 运行 parallel_predict
函数,所有 20 个进程都会无缘无故地标记为处于不间断睡眠 (D) 状态。我没有向磁盘写入任何内容,只是将输出作为 iPython 笔记本中的变量。
作为最后的尝试,我尝试在 p.join()
之后包含 del p
,这在一定程度上有所帮助(函数 运行s 通常更频繁),但我仍然偶尔会有进程为 D 的问题,尤其是当我在队列中有很多进程时。
编辑:
一般来说,在 p.join()
之后添加 del p
可以防止进程进入 (D) 状态,但我仍然遇到函数将完成所有进程的问题(据我所知可以从 top
) 看出,但不会 return 结果。当我停止 iPython Notebook 内核时,出现错误 ZMQError: Address already in use
.
我应该如何正确启动或完成多处理池以防止这种情况发生?
我改变了四件事,现在 1) 进程不再进入 (D) 状态和 2) 我可以 运行 这些功能背靠背并且它们总是 return 结果和别挂了。
到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
最后,我在 if __name__ == "__main__"
中嵌入了调用 parallel_predict
的行:
if __name__ == "__main__":
all_results = parallel_predict(subjects,conditions)
我正在 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 启动笔记本后,它们 运行 快速且如预期的那样(在 'Running' 状态下 ~100% cpu 在 20 个核心中)。但是,有时如果我在第一次 运行 之后立即重新 运行 parallel_predict
函数,所有 20 个进程都会无缘无故地标记为处于不间断睡眠 (D) 状态。我没有向磁盘写入任何内容,只是将输出作为 iPython 笔记本中的变量。
作为最后的尝试,我尝试在 p.join()
之后包含 del p
,这在一定程度上有所帮助(函数 运行s 通常更频繁),但我仍然偶尔会有进程为 D 的问题,尤其是当我在队列中有很多进程时。
编辑:
一般来说,在 p.join()
之后添加 del p
可以防止进程进入 (D) 状态,但我仍然遇到函数将完成所有进程的问题(据我所知可以从 top
) 看出,但不会 return 结果。当我停止 iPython Notebook 内核时,出现错误 ZMQError: Address already in use
.
我应该如何正确启动或完成多处理池以防止这种情况发生?
我改变了四件事,现在 1) 进程不再进入 (D) 状态和 2) 我可以 运行 这些功能背靠背并且它们总是 return 结果和别挂了。
到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
最后,我在 if __name__ == "__main__"
中嵌入了调用 parallel_predict
的行:
if __name__ == "__main__":
all_results = parallel_predict(subjects,conditions)