<p>当您使用<code>multiprocessing</code>打开第二个进程时,会创建一个具有自己全局状态的全新Python实例</em>。该全局状态不共享,因此子进程对全局变量所做的更改对父进程不可见。</p>
<p>此外,<code>multiprocessing</code>提供的大多数抽象都使用pickle来传输数据。使用代理<a href="http://docs.python.org/library/multiprocessing.html#all-platforms" rel="noreferrer">must be pickleable</a>;传输的所有数据,包括<a href="http://docs.python.org/library/multiprocessing.html#multiprocessing-managers" rel="noreferrer">^{<cd3>} provides</a>的所有对象。相关引文(我强调):</p>
<blockquote>
<p>Ensure that the arguments to the methods of <em>proxies</em> are picklable.</p>
</blockquote>
<p>以及(在<code>Manager</code>部分中):</p>
<blockquote>
<p>Other processes can access the shared objects by using <em>proxies</em>.</p>
</blockquote>
<p><code>Queue</code>也需要可pickle的数据;文档没有这么说,但是快速测试证实了这一点:</p>
<pre><code>import multiprocessing
import pickle
class Thing(object):
def __getstate__(self):
print 'got pickled'
return self.__dict__
def __setstate__(self, state):
print 'got unpickled'
self.__dict__.update(state)
q = multiprocessing.Queue()
p = multiprocessing.Process(target=q.put, args=(Thing(),))
p.start()
print q.get()
p.join()
</code></pre>
<p>输出:</p>
<pre><code>$ python mp.py
got pickled
got unpickled
<__main__.Thing object at 0x10056b350>
</code></pre>
<p>如果您真的不能pickle数据,那么<em>可能为您工作的一种方法是找到一种将其存储为<code>ctype</code>对象的方法;然后对内存的引用可以是<a href="http://docs.python.org/library/multiprocessing.html#shared-ctypes-objects" rel="noreferrer">passed to a child process</a>。这对我来说似乎很狡猾,我从来没有做过。但这对你来说可能是个解决办法。</p>
<p>考虑到您的更新,您似乎需要更多地了解<code>LORR</code>的内部内容。<code>LORR</code>是类吗?你能从中派生出来吗?是不是别的东西的子类?什么是MRO?(尝试<code>LORR.__mro__</code>并发布输出(如果它有效的话)如果它是一个纯python对象,就可以对它进行子类化,创建一个<code>__setstate__</code>和一个<code>__getstate__</code>来启用pickling。</p>
<p>另一种方法可能是找出如何从<code>LORR</code>实例中获取相关数据并通过一个简单的字符串传递它。既然你说你真的只想调用对象的方法,为什么不直接使用<code>Queue</code>来来回发送消息呢?换句话说,类似这样的东西(示意性地):</p>
<pre><code>Main Process Child 1 Child 2
LORR 1 LORR 2
child1_in_queue -> get message 'foo'
call 'foo' method
child1_out_queue <- return foo data string
child2_in_queue -> get message 'bar'
call 'bar' method
child2_out_queue <- return bar data string
</code></pre>