Python多处理不断地生成pythonw.exe进程而不进行任何实际工作

时间:2010-08-04 12:19:01

标签: python windows process multiprocessing

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

# 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 个答案:

答案 0 :(得分:32)

您需要protect then entry point of the program by using 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()

答案 1 :(得分:2)

根据用于多处理的programming guidelines,在Windows上您需要使用if __name__ == '__main__':

答案 2 :(得分:1)

好笑,可以在我的Linux机器上运行:

$ python mp.py
works  4
done
$

多处理事情应该适用于Windows吗?许多源自Unix世界的程序都不能很好地处理Windows,因为Unix使用fork(2)来非常便宜地克隆进程,但是(我的理解是)Windows不优雅地支持fork(2),如果有的话。