我注意到我可以访问子流程功能/目标之外的子流程中的功能和模块。所以我想知道当我在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()
答案 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)。