jupyter notebook 中的 multiprocessing.Pool 适用于 linux 但不适用于 windows

Posted

技术标签:

【中文标题】jupyter notebook 中的 multiprocessing.Pool 适用于 linux 但不适用于 windows【英文标题】:multiprocessing.Pool in jupyter notebook works on linux but not windows 【发布时间】:2016-09-03 08:22:27 【问题描述】:

我正在尝试运行一些独立的计算(尽管从相同的数据中读取)。我的代码在 Ubuntu 上运行时有效,但在 Windows (windows server 2012 R2) 上运行时却出现错误:

'module' object has no attribute ...

当我尝试使用 multiprocessing.Pool 时(它出现在内核控制台中,而不是笔记本本身的输出)

(而且我已经犯了在创建池之后定义函数的错误,我也已经更正了,这不是问题)。

即使是最简单的例子也会发生这种情况:

from multiprocessing import Pool
def f(x):
    return x**2
pool = Pool(4)
for res in pool.map(f,range(20)):
    print res

我知道它需要能够导入模块(我不知道在笔记本中工作时它是如何工作的),我听说过IPython.Parallel,但我一直找不到任何文档或示例。

欢迎任何解决方案/替代方案。

【问题讨论】:

解决方案是here 【参考方案1】:

由于我没有完整的答案,因此我会将其作为评论发布,但我会在弄清楚发生了什么后进行修改。

from multiprocessing import Pool

def f(x):
    return x**2

if __name__ == '__main__':
    pool = Pool(4)
    for res in pool.map(f,range(20)):
        print(res)

这行得通。我相信这个问题的答案是here。简而言之,子进程并不知道自己是子进程,而是试图递归地运行主脚本。

这是我得到的错误,它给了我们相同的解决方案:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

【讨论】:

完全正确。事实上,文档说明了 Windows 上多处理的几个问题。见docs.python.org/2/library/multiprocessing.html#windows

以上是关于jupyter notebook 中的 multiprocessing.Pool 适用于 linux 但不适用于 windows的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter Notebook 中的 Handsontable

PySpark 和 Jupyter-notebook 中的 Collect() 错误

python 显示Jupyter Notebook中的所有列。

在Jupyter notebook中使用特定虚拟环境中的python的kernel

Jupyter Notebook 中的输出格式

Jupyter Notebook 中的 GridSearchCV 进度