假设您要并行运行多个进程(使用多处理,可能在多个独立的计算机上,如在群集中),其中每个进程都会创建特定类的新实例列表。然后,您将所有这些列表发送回父进程,并且您希望将它们组合在一起。现在,我们可以通过对象ID索引这些实例吗?我可以期望id唯一地标识对象,因为每个对象是在单独的进程(可能是单独的机器)上生成的吗?
换句话说,对象的id是否能够在进程之间发送数据所需的pickle中存活,还是解释器在取消对象时为对象分配了一个新的唯一id?
答案 0 :(得分:1)
你问,对象的id是否能在酸洗中存活下来?答案是不。该对象被pickle并发送到另一个进程,并在该进程中使用新的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信息(可能是一个简单的数字,例如进程“rank”(顺序),或者可能是一个类似于随机生成的哈希,或其他东西......你选择)。如果您提前创建此属性并在其中存储“id”,则应在pickle
内维护此信息。但是,如果您尝试向任何对象动态添加id
属性,则pickle
将“忘记”添加该属性,并且反序列化的对象将不具有该属性。或者,如果您使用像dill
这样的“高级”序列化程序,则可以在类实例或几乎任何对象上挑选动态添加的属性。