Python多处理对象引用

时间:2015-07-09 08:50:34

标签: 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>

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

1 个答案:

答案 0 :(得分:1)

  

怎么可能?

每个流程都有自己的Virtual Address Space

  

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

没有。子进程继承其父进程的VAS。请参阅clonefork

  

如果在每个流程中它都是同一个对象,那么对它的变化是不是全局的,而是每个流程的本地流程?

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

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

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

中进行描述

但是,最好避免使用,尤其是,如果以上所有内容都是新闻。