可以在父进程和子进程之间共享dict吗?

克莱默·李

请检查以下代码

from multiprocessing import Process

return_dict = dict({})
print "address in parent %s " % id(return_dict)


def f(return_dict):
    print "address in child %s " % id(return_dict)


p = Process(target=f, args=(return_dict, ))
p.start()
p.join()

输出是

address in parent 23059696 
address in child 23059696 

我在父进程和子进程中打印字典的地址。他们是一样的。但是,如果我在子进程中更改了dict,则更改将不会影响父进程中的di​​ct。

因此,我假设dict是内存中的两个不同对象。但是为什么那里的地址都一样?

有人可能会说它是相对地址,但是为什么相对地址必须相同?

马丁·彼得斯(Martijn Pieters)

在你的平台上,multiprocessing采用分叉产卵一个子进程。通过这种方式分叉进程,可以使子进程在写时复制方案中使用完全相同的内存区域

因此,当子进程启动并将字典传递到f()函数中时,它仍然是相同的字典对象它已从父进程“继承”。

接下来,id()对象值是虚拟内存地址内存由操作系统虚拟化;每个进程都被分配了物理内存区域,但是它们在该空间中的地址由OS转换。在分叉时,将为子进程提供相同的虚拟地址空间,并在需要时透明地生成时复制副本,其中相同的虚拟内存地址范围现在映射到另一块物理内存上。因此,从Python子进程的角度来看,id()不会改变,但不再引用相同的物理内存。组合os.getpid()id()独特,但价值id()仅此还,不跨进程。

如果您在Windows上运行相同的代码(不支持分支),则会看到ID总是会有所不同。Windows子进程不能继承对象。

同样,您通常希望避免在multiprocessing代码中使用全局共享的可变对象突变仅在单个子进程中可见,但是可以重复使用进程,从而产生不一致的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章