2013-01-05 24 views
13

我正在为我的初学者学生玩图书馆,我正在Python中使用多处理模块。我就遇到了这个问题:importing and using a module that uses multiprocessing without causing infinite loop on Windows为什么在Windows上启动一个新进程时,Python的多进程模块会导入__main__?

举个例子,假设我有一个模块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() 

而且调用此库的主要程序:

# main.py 

import mylibrary 

mylibrary.foo() 

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

import mylibrary 

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

但是,这对于初学者来说是相当混乱的,而且它看起来应该不是必须的。新进程正在创建mylibrary,那么为什么新进程只导入mylibrary?有没有办法解决这个问题,而不必更改main.py?顺便说一下,我使用Python 2.7。

回答

23

Windows没有fork,所以没有办法像现有的那样创建一个新的进程。所以子进程必须再次运行你的代码,但是现在你需要一种方法来区分父进程和子进程,并且是这样的。

这是覆盖在这里的文档:http://docs.python.org/2/library/multiprocessing.html#windows

我不知道的另一种方式来架构代码,以避免叉炸弹的效果。

+4

这个答案应该被接受。 – Marcin

+1

我确定我错过了一些东西,但我的问题是为什么子进程必须再次运行所有的代码。为什么不只是启动新流程的模块? – Laura

+0

@Laura:它必须再次运行您的所有代码,因为如果没有,它将不会有您的代码。子进程完全开始,如果你想让它有你的功能,它需要你的代码。 –

相关问题