繁体   English   中英

Python多处理对象引用

[英]Python multiprocessing object reference

我没有得到python多处理模块。 我用函数启动一个进程,并将pass和object作为参数。 据我了解,它应该是该对象的精确副本。 但是,如果我尝试打印该对象的地址,则在每个进程中都是相同的。 怎么可能? 不应该在每个过程中都有所不同吗? 如果它在每个过程中都是同一个对象,那么它的变化对于每个过程来说都不是全局的而是局部的?

我的对象定义如下:

class MyClass():

    my_field = None

    def __init__():
        self.my_field = 0

并且在单独的过程中运行的功能

def function_to_run_in_process(some_object):
    print some_object

多个流程的结果如下:

<__main__.MyClass instance at 0x7f276419e5f0>
<__main__.MyClass instance at 0x7f276419e5f0>
<__main__.MyClass instance at 0x7f276419e5f0>

等等。

如果我试图改变进程内部对象的某些字段,如下所示:

def function_to_run_in_process(some_object, process_lock):
   process_lock.acquire()
   some_object.some_field = some_object.some_field + 1
   process_lock.acquire()
   print some_object, 'with some_field = ', some_object.some_field, 'at address: ', hex(id(some_object.some_field))

我得到的结果与此类似:

<__main__.MyClass instance at 0x7f276419e5f0>  with some_field = 1  at address  0xc5c428>
<__main__.MyClass instance at 0x7f276419e5f0>  with some_field = 1  at address  0xc5c428>
<__main__.MyClass instance at 0x7f276419e5f0>  with some_field = 1  at address  0xc5c428>

因此,如果传递的对象只是一个副本,为什么不仅对于对象有相同的地址,甚至对于它的字段? 如果他们是相同的,为什么不能看到该领域的变化?

怎么可能?

每个进程都有自己的虚拟地址空间

不应该在每个过程中都有所不同吗?

不会。子进程继承其父进程的VAS。 请参阅clonefork

如果它在每个过程中都是同一个对象,那么它的变化对于每个过程来说都不是全局的而是局部的?

VAS中的进程内存页面将设置为COPY ON WRITE 只要页面没有更改,它们都将指向相同的物理内存,但是如果进行任何更改,则该页面的VAS将映射到不同的位置。


这是一篇关于流程内存管理的文章: http//duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/


如果要在进程之间共享状态,则可以共享内存或传递消息。 多处理模块可以在共享内存页面中创建python对象,这在此处描述

但是,最好避免使用, 特别是如果上述所有内容都是新闻。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM