簡體   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