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()
会不断创建“pythonw.exe”进程,而且它什么都不打印,尽管我是在命令行中运行它的:
python mp.py
我在Windows 7上运行的是最新的Python 2.6,既有32位的也有64位的。
3 个回答
1
有趣的是,在我的Linux机器上可以正常运行:
$ python mp.py
works 4
done
$
那这个多进程的功能在Windows上应该能用吗?很多程序最初是在Unix系统上开发的,它们在Windows上运行得不太好,因为Unix使用fork(2)
这个方法来快速复制进程,而我了解到Windows似乎并不支持fork(2)
,或者支持得很不好。
2
根据关于多进程编程的 指导原则,在Windows系统上,你需要使用 if __name__ == '__main__':
这段代码。
32
你需要通过使用 if __name__ == '__main__':
来保护程序的入口点。
这是一个特定于Windows的问题。在Windows上,你的模块必须被导入到一个新的Python解释器中,才能访问你的目标代码。如果你不阻止这个新的解释器运行启动代码,它会产生另一个子进程,然后又会产生另一个子进程,直到你看到的 pythonw.exe
进程数目多得数不清。
其他平台使用 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()