我正在尝试multiprocessing.pool,它似乎工作正常,除了整个脚本一次又一次地循环.....
我的代码 -
from multiprocessing import Pool
print "at top!"
arr = [30, 30, 30, 30]
def fib(num):
if num == 0 or num == 1: return 1
else: return (fib(num - 1) + fib(num - 2))
def main():
print "start"
pool = Pool(processes=4)
result = [pool.apply_async(fib, args=(arr[i],)) for i in range(4)]
pool.close()
pool.join()
for res in result:
print res.get()
print "end"
if __name__ == '__main__':
main()
print "end of program ?"
它返回的是这个 -
at top!
start
at top!
end of program ?
at top!
end of program ?
at top!
end of program ?
at top!
end of program ?
1346269
1346269
1346269
1346269
end
end of program ?
我不想要的是重复at top !
和end of program
。
我希望主程序在此时冻结,并且只在所有计算完成后才继续。
PS。我在Windows 10,64位上运行它。 Python 2.7 32位。
提前致谢。
答案 0 :(得分:3)
如果你正在运行Windows,那就是python windows生成进程的方式:脚本导入的次数与生成的进程一样多。因此,如果您放置缩进(在脚本顶级),则不能只有一个"at top"
打印。同样适用于print "end of program ?"
。
(这不会发生在Linux上,这解释了用户的评论,说他们无法复制)
这也是您必须使用main
测试保护if __name__ == '__main__'
的原因。因此,要获得预期的输出,您必须这样做:
if __name__ == '__main__':
print "at top!"
main()
print "end of program"