2014-10-10 32 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