Python Multiprocessing 迭代脚本

dev*_*yti 5 python windows multiprocessing python-multiprocessing

我正在尝试使用 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 ?"
Run Code Online (Sandbox Code Playgroud)

它返回的是这个——

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 ?
Run Code Online (Sandbox Code Playgroud)

我不想要的是重复at top !end of program

我希望主程序在那一刻冻结,并在所有计算完成后继续。

附注。我在 Windows 10 64 位上运行它。Python 2.7 32 位。

提前致谢。

Jea*_*bre 6

如果您正在运行 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")
Run Code Online (Sandbox Code Playgroud)