[英]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。 请参阅clone和fork 。
如果它在每个过程中都是同一个对象,那么它的变化对于每个过程来说都不是全局的而是局部的?
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.