Python多进程不断生成pythonw.exe进程但未执行实际工作

15 投票
3 回答
5806 浏览
提问于 2025-04-16 02:18

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

# 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()

撰写回答