オブジェクト インスタンスのディクショナリを と共有する際に問題が発生していますmultiprocessing
。dict
によって共有されているを使用manager
しようとしていますが、オブジェクト インスタンスをキーとして使用しようとすると、コピーされます。
import multiprocessing
class Dog():
def __init__(self, name = "joe"):
self.name = name
def bark(self):
print("woof")
mg = multiprocessing.Manager()
dt = mg.dict()
dt["a"] = 1
dt["b"] = 2
# As expected
print(dt.items()) # => [('a', 1), ('b', 2)]
dt = mg.dict()
lab = Dog("carl")
print(lab) # => <__main__.Dog instance at 0x7f8d6bb869e0>
dt[lab] = 1
# But then I don't get the ID I expect
print(dt.items()) # => [(<__main__.Dog instance at 0x7f8d6bb86908>, 1)]
これを回避する方法はオブジェクト ID をキーとして使用することだと理解していますが、なぜこのようなことが起こっているのでしょうか? オブジェクト ID を使用することは、問題に対する最善の解決策ですか? manager
dict()
これは、通常の非オブジェクトでは発生しないことに気付きました。
別のアプローチ
のドキュメントでManager()
、問題の一部がサーバーに変更を通知していることを読んだので、コードをこれに変更しましたが、犬が参照されずにコピーされるという同じ問題がまだあります。
import multiprocessing
class Dog():
def __init__(self, name = "joe"):
self.name = name
def bark(self):
print("woof")
mg = multiprocessing.Manager()
dt = dict()
lp = mg.list()
lp.append(dt)
print(lp)
dt["a"] = 1
dt["b"] = 2
lp[0] = dt
print(lp)
dt = dict()
lab = Dog("carl")
print(lab)
pup = Dog("steve")
print(pup)
dt[lab] = 1
dt[pup] = 2
lp[0] = dt
# Their ids change again
print(lp)