2017-06-15 46 views
2

我在multiprocessing.pool想我的手,它似乎做工精细,除了整个脚本一次又一次的循环.....Python的多重迭代脚本

我的代码 -

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

奇怪,当我运行这个(在python2.7)我只得到'在top'和'程序结束'一次? – JohanL

+1

你能把这个标记为“windows”(这很可能是你遇到问题的平台)吗? –

+0

是的,抱歉,我忘了添加我在Windows平台上运行它。 – devojoyti

回答

1

如果您正在运行windows,python窗口生成进程的方式如下:脚本的导入次数与生成的进程相同。因此,如果您将其缩小(在脚本顶层),您不能只有一个"at top"打印。当然,print "end of program ?"也是如此。

(这不会在Linux上这也解释了用户说,他们无法重现的意见发生)这也就是为什么你必须保护你的mainif __name__ == '__main__'测试。因此,要获得预期的输出,你就必须做:

if __name__ == '__main__': 
    print "at top!" 
    main() 
    print "end of program"