Python多重处理是否从父级复制所有模块?

时间:2019-08-19 14:28:22

标签: python multiprocessing

我注意到我可以访问子流程功能/目标之外的子流程中的功能和模块。所以我想知道当我在python中创建子进程时,它会复制当前进程中的所有内容吗?为什么我可以访问子目标之外的功能和导入的模块?

from multiprocessing import Process, Pipe

def test1():
         return "hello"

def simpleChildProcess( childPipe ):
       # simpleChildProcess can access test1 function
       foo = test1()
       childPipe.send( foo )

parentPipe, childPipe = Pipe()
childProcess = Process( target=simpleChildProcess, args=(childPipe,) )

childProcess.start()

print "Pipe Contains: %s" % parentPipe.recv()

1 个答案:

答案 0 :(得分:3)

在类似Unix的操作系统上,使用multiprocessing.Process uses os.fork生成新进程。 fork创建一个新流程,该流程是父流程的副本,并且分叉的流程从调用fork的位置恢复。

由于Windows缺少fork,因此multiprocessing.Process启动了一个新的Python进程并导入了调用模块。在Windows上,对Process的调用必须在if __name__ == '__main__'内部,以防止每次导入调用模块时重复调用Process。 (即使在Unix上,都包含if __name__ == '__main__':也是很好的做法,以防止您的代码导致失控的进程产生。)

因此,子进程可以访问由调用模块定义的功能和模块,直到调用Process的地方(对于Unix)或导入调用模块后(对于Windows)。