我在与multiprocessing
. 我正在尝试使用 adict
共享的 a 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)