为什么在Windows上启动新进程时,python的多处理模块会导入__main__ ?

Why does Python's multiprocessing module import __main__ when starting a new process on Windows?

我正在为我的初学者们准备一个库,我正在使用Python中的多处理模块。我遇到了这个问题:导入和使用一个模块,该模块使用多处理而不会在Windows上造成无限循环。

例如,假设我有一个模块mylibrary.py

1
2
3
4
5
6
7
8
9
10
11
# mylibrary.py

from multiprocessing import Process

class MyProcess(Process):
    def run(self):
        print"Hello from the new process"

def foo():
    p = MyProcess()
    p.start()

以及一个调用这个库的主程序:

1
2
3
4
5
# main.py

import mylibrary

mylibrary.foo()

如果我在Windows上运行main.py,它会尝试将main.py导入新进程,这意味着代码会再次执行,从而产生无限循环的进程生成。我可以这样修复它:

1
2
3
4
import mylibrary

if __name__ =="__main__":
    mylibrary.foo()

但是,对于初学者来说,这是非常令人困惑的,而且似乎不需要这样做。新的进程是在mylibrary中创建的,那么为什么新的进程不只是导入mylibrary呢?有没有一种方法可以解决这个问题而不必更改main.py

顺便说一下,我使用的是python 2.7。


Windows没有fork,因此无法像现有的那样创建新的进程。所以子进程必须再次运行代码,但是现在您需要一种方法来区分父进程和子进程,而__main__就是这样。

这里的文档包括:http://docs.python.org/2/library/multiprocessing.html windows

我不知道用另一种方法来构造代码以避免分叉炸弹效应。