我不明白为什么这个简单的代码
# 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)
所有。