我不明白为什么这个简单的代码
# 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位
答案 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)
,如果有的话。