0

各プロセスが特定のクラスの新しいインスタンスのリストを作成する場合、いくつかのプロセスを並行して実行したいとします (マルチプロセッシングを使用し、クラスター内のように複数の別々のマシンで実行することもできます)。次に、これらすべてのリストを親プロセスに送り返し、それらを結合します。さて、これらのインスタンスをオブジェクト ID でインデックス化できますか? 各オブジェクトが別のプロセス (場合によっては別のマシン) で生成された場合、ID がオブジェクトを一意に識別することを期待できますか?

言い換えれば、オブジェクトの ID は、プロセス間でデータを送信するために必要な pickle 化後も存続しますか? それとも、オブジェクトを unpickle するときに、インタープリターがオブジェクトに新しい一意の 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 に答える