使用多处理模块的简单玩具示例使计算机崩溃

iRo*_*biv 5 python

尝试以下非常简单的示例会导致计算机停止运行,因此我必须重新启动.检查任务管理器显示数百个"python.exe"任务:

import math
from multiprocessing import Pool

pool = Pool(processes=2)
print pool.map(math.sqrt, [1,4,9,16])
Run Code Online (Sandbox Code Playgroud)

我使用的是双核cpu(i5 2467m)所以我认为以上都没问题.

我尝试设置processes=1,这导致一个稍微不同的问题:任务永远不会完成,但它不会导致我的计算机冻结.

有任何想法吗?

Sil*_*Ray 8

我第一次玩的时候遇到了同样的问题multiprocessing.将池生成代码包装在一个if __name__ == '__main__'块中.

import math
from multiprocessing import Pool

if __name__ == '__main__':
    pool = Pool(processes=2)
    print pool.map(math.sqrt, [1,4,9,16])
Run Code Online (Sandbox Code Playgroud)

发生的事情是,在创建子进程时,您的模块正在进行unpickled并在无限递归中重新运行池生成代码.使用该if块,产生代码将仅在模块的父实例中运行.

  • 对 - 这可能是解决方案,因为Windows没有`fork`.很好的抓住.在`unix`下,这使用`fork`,所以它可能需要一个不同的代码路径(这就是为什么它在OS-X上对我有用) (2认同)