Python多处理迭代脚本

时间:2017-06-15 06:42:05

标签: 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 ?"

它返回的是这个 -

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位。

提前致谢。

1 个答案:

答案 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"