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

Lau*_*ura 22 python windows multiprocessing python-2.7

我正在为初学者学习图书馆,我正在使用Python中的多处理模块.我遇到了这个问题:导入和使用一个使用多处理的模块,而不会在Windows上造成无限循环

举个例子,假设我有一个模块mylibrary.py:

# mylibrary.py

from multiprocessing import Process

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

def foo():
    p = MyProcess()
    p.start()
Run Code Online (Sandbox Code Playgroud)

以及调用此库的主程序:

# main.py

import mylibrary

mylibrary.foo()
Run Code Online (Sandbox Code Playgroud)

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

import mylibrary

if __name__ == "__main__":
    mylibrary.foo()
Run Code Online (Sandbox Code Playgroud)

但是,这对初学者来说非常困惑,而且似乎没有必要.正在创建新流程mylibrary,为什么新流程不会导入mylibrary?有没有办法解决这个问题而不必改变main.py

顺便说一句,我正在使用Python 2.7.

Ned*_*der 33

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

这在以下文档中有所介绍:http://docs.python.org/2/library/multiprocessing.html#windows

我不知道另一种方法来构造代码以避免fork炸弹效应.

  • @Laura:它必须再次运行你的所有代码,因为如果没有,它就不会有你的代码。子进程是全新开始的,如果你想让它拥有你的功能,它需要你的代码。 (2认同)
  • @Laura:关键是,有一个应该调用该模块的上下文,即主脚本所在的上下文。由于 Windows 没有 fork,它不能只是将上下文复制到新的上下文中过程中,它必须调用主脚本,以便可以再次设置它。这就是为什么您将实际的程序代码放在 `if __name__ == "__main__":` 块中。导致它的一切只是设置环境(所有导入、函数定义等)。 (2认同)