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 上产生无限进程并使我的机器崩溃。为什么?
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 上产生无限进程并使我的机器崩溃。为什么?
在 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()