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)