2014-10-10 101 views
0

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

换句话说,对象的id是否在进程间发送数据所需的酸洗过程中存活,还是解释器在取消对象时为对象分配新的唯一标识?

回答

1

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

+1

我认为你的意思是他的问题的答案是“是” - 他问*“我可以期待id的唯一标识对象,因为每个对象都是在单独的进程上生成的(可能是一台单独的机器)?” *他想知道在父进程中ID是否保证是唯一的。他们是,你提到的确切原因。 – dano 2014-10-10 22:21:49

+0

我的意思是没有。我回答说:“对象的id是否在酸洗中幸存下来......”但我应该澄清一下,谢谢。 – 2014-10-10 22:24:55