0

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

换句话说,对象的 id 是否能够在进程之间发送数据所需的酸洗中存活下来,或者解释器在解开对象时是否为对象分配了一个新鲜且唯一的 id?

4

1 回答 1

1

您问,对象的 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程序,您可以在类实例或几乎任何对象上腌制动态添加的属性。

于 2014-10-10T22:20:10.950 回答