Python multiprocessing object reference(Python多处理对象引用)
本文介绍了Python多处理对象引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我不了解Python多处理模块。 我使用函数启动一个进程,并将传递和对象作为其参数。据我所知,它应该是那个物体的一模一样的复制品。但如果我尝试打印该对象的地址,则在每个过程中都是相同的。这怎么可能呢?地址不应该在每个过程中都不同吗?如果它在每个进程中都是同一个对象,为什么对它的更改不是全局的,而是每个进程的本地更改?
我的对象定义如下:
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>
那么,如果传递的对象只是一个副本,为什么不仅对象有相同的地址,甚至它的字段也有相同的地址?如果它们相同,为什么对该字段的更改不可见?
推荐答案
怎么可能?
每个进程都有自己的Virtual Address Space
每个进程中的地址不应该不同吗?
不。子进程正在继承其父进程的VAS。请参阅clone和fork。
VAS中的进程内存页将设置为COPY ON WRITE。只要页面没有更改,它们都将指向相同的物理内存,但是,如果进行了任何更改,该页面的VAS将映射到不同的位置。如果它在每个进程中都是同一个对象,为什么对它的更改不是全局的,而是每个进程的本地更改?
这里有一篇关于进程内存管理的文章:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
如果您希望在进程之间共享状态,则可以共享内存或传递消息。多处理模块可以在共享内存页中创建PYTHON对象,具体说明here
不过,最好避免这样做,尤其是如果以上所有情况对您来说都是新闻。
这篇关于Python多处理对象引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Python多处理对象引用


猜你喜欢
- YouTube API v3 返回截断的观看记录 2022-01-01
- 使用 Cython 将 Python 链接到共享库 2022-01-01
- 如何使用PYSPARK从Spark获得批次行 2022-01-01
- ";find_element_by_name(';name';)";和&QOOT;FIND_ELEMENT(BY NAME,';NAME';)";之间有什么区别? 2022-01-01
- 我如何卸载 PyTorch? 2022-01-01
- CTR 中的 AES 如何用于 Python 和 PyCrypto? 2022-01-01
- 计算测试数量的Python单元测试 2022-01-01
- 我如何透明地重定向一个Python导入? 2022-01-01
- 检查具有纬度和经度的地理点是否在 shapefile 中 2022-01-01
- 使用公司代理使Python3.x Slack(松弛客户端) 2022-01-01