擅长:python、mysql、java
<p>当您创建<code>multiprocessing.Manager</code>时,将产生一个单独的服务器进程,该进程负责托管<code>Manager</code>创建的所有对象。因此,为了将<code>Dog</code>实例存储在<code>Manager</code><code>dict</code>中,需要对该实例进行pickle并将其发送到<code>Manager</code>进程。当然,这会导致在<code>Manager</code>进程中创建一个完全独立的<code>Dog</code>实例,因此它的ID将与父进程中的<code>Dog</code>实例的ID不匹配。除了在<code>Manager</code>中创建<code>Dog</code>实例作为<code>Proxy</code>实例之外,没有其他方法可以避免:</p>
<pre><code>import multiprocessing
from multiprocessing.managers import SyncManager
def Manager():
m = SyncManager()
m.start()
return m
class Dog():
def __init__(self, name = "joe"):
self.name = name
def bark(self):
print("woof")
SyncManager.register("Dog", Dog)
mg = 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 = mg.Dog("carl")
print(lab)
pup = mg.Dog("steve")
print(pup)
dt[lab] = 1
dt[pup] = 2
lp[0] = dt
# Their ids don't change
print(lp)
</code></pre>
<p>输出:</p>
^{pr2}$
<p>请记住,这将使对父进程中的<code>Dog</code>实例的所有访问变慢,因为它们现在需要对<code>Manager</code>进程进行IPC调用。在</p>