Python多处理不断产生pythonw.exe进程,而不做任何实际的工作

我不明白为什么这个简单的代码

# file: mp.py from multiprocessing import Process import sys def func(x): print 'works ', x + 2 sys.stdout.flush() p = Process(target= func, args= (2, )) p.start() p.join() p.terminate() print 'done' sys.stdout.flush() 

不断创build“pythonw.exe”进程,即使我从命令行运行它也不会打印任何东西:

 python mp.py 

我在32位和64位的Windows 7上运行最新的Python 2.6

你需要使用if __name__ == '__main__':来保护程序的入口点 。

这是Windows特定的问题。 在Windows上,您的模块必须导入到一个新的Python解释器中才能访问您的目标代码。 如果你不停止这个新的解释器运行启动代码,它会产生另一个孩子,然后产生另一个孩子,直到它的pythonw.exe进程尽可能的眼睛可以看到。

其他平台使用os.fork()来启动子os.fork() ,所以没有重新导入模块的问题。

所以你的代码需要如下所示:

 from multiprocessing import Process import sys def func(x): print 'works ', x + 2 sys.stdout.flush() if __name__ == '__main__': p = Process(target= func, args= (2, )) p.start() p.join() p.terminate() print 'done' sys.stdout.flush() 

根据多处理的编程指南 ,在windows上你需要使用if __name__ == '__main__':

有趣的,在我的Linux机器上工作:

 $ python mp.py works 4 done $ 

多处理的东西是否应该在Windows上工作? 很多源于Unix世界的程序都不能很好地处理Windows,因为Unix使用fork(2)很便宜地克隆进程,但是(据我的理解),Windows不会优雅地支持fork(2)所有。