1
def print_square(i):
    print str(i*i)

from multiprocessing import Pool
p = Pool(1)
for i in range(10):
    p.apply_async(print_square, args=(i,))
p.close()
p.join()

在 python 2.7 上使用 64 位机盖在 Windows 8 上产生无限进程并使我的机器崩溃。为什么?

4

1 回答 1

2

在 Windows 上,由于没有 fork,因此 multiprocessing 会产生一个新进程,运行 python 并导入调用模块。

如果导入调用模块本身会产生一个新进程,那么您将自己进行分叉炸弹。为防止这种情况发生,请将生成新进程的代码放入其中

if __name__ == '__main__':

这是有效的,因为在if-statement导入模块时不会执行内部的代码。

文档中有关于此的警告。请参阅标题为 安全导入主模块的部分。


所以使用

from multiprocessing import Pool


def print_square(i):
    print str(i * i)

if __name__ == '__main__':
    p = Pool(1)
    for i in range(10):
        p.apply_async(print_square, args=(i,))
    p.close()
    p.join()
于 2013-08-20T16:22:40.293 回答