繁体   English   中英

Python多重处理:对象标识符在进程之间是唯一的

[英]Python multiprocessing: object identifier unique across processes

假设您要并行运行多个进程(使用多进程,可能在集群中的多个不同机器上使用多进程),其中每个进程都会创建一个特定类的新实例的列表。 然后,将所有这些列表发送回父进程,并希望将它们合并。 现在,我们可以通过它们的对象ID索引这些实例吗? 如果每个对象都是在单独的进程(可能是单独的机器)上生成的,我是否可以期望ID唯一标识对象?

换句话说,对象的ID是否可以在进程之间发送数据所需的酸洗中保留下来,还是当解开对象时解释器为对象分配新的唯一ID?

您问,对象的ID是否可以在酸洗中生存? 答案是不。 将该对象腌制并发送到另一个进程,并在该进程中使用新的ID创建一个新的对象。 结果将发送回原始过程。 id无法生存……它们是不同的对象。 即使在相同的过程中,Id也常常无法幸免于难……尝试obj2 = pickle.loads(pickle.dumps(object))并查看obj2 is object …情况通常并非如此。

>>> import dill
>>>     
>>> class A(object):
...   pass
... 
>>> b = A()
>>> 
>>> id(b)
4473714832
>>> id(dill.loads(dill.dumps(b)))  
4486366032
>>> 

但是,如果您想维护一个“ id”以了解哪个对象是哪个对象,则可以。 只需添加一个存储一些ID信息的id属性即可(可以是一个简单的数字,例如流程“等级”(顺序),也可以是随机生成的哈希,或者您选择的其他东西)。 如果您提前创建此属性,并将“ id”存储在此处,则它应在pickle维护此信息。 但是,如果尝试向任何对象动态添加id属性,则pickle将“忘记”已添加的属性,反序列化的对象将不具有该属性。 或者,如果使用像dill这样的“高级”序列化程序,则可以在类实例或几乎任何对象上腌制动态添加的属性。

暂无
暂无

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

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