当你
multiprocessing用来打开第二个进程时,将创建一个具有自己全局状态的Python 全新实例。该全局状态不会共享,因此子进程对全局变量所做的更改对于父进程将是不可见的。
此外,提供的大多数抽象都
multiprocessing使用
pickle来传输数据。使用代理传输的所有数据必须是可腌制的 ; 包括a Manager提供的所有对象。相关报价(我的重点):
确保代理方法的参数可挑剔。
并且(在本
Manager节中):
其他进程可以使用代理访问共享库。
Queue还需要可腌制的数据;文档没有这么说,但是通过快速测试可以确认:
import multiprocessingimport pickleclass 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()
输出:
$ python mp.py got pickledgot unpickled<__main__.Thing object at 0x10056b350>
如果你真的不能腌制数据,一种可能对你有用的方法是找到一种将其存储为ctype对象的方法。然后可以将对内存的引用传递给子进程。对我来说这似乎很狡猾。我没做过 但这可能是你可能的解决方案。
在进行了更新之后,你似乎需要进一步了解的内部结构LORR。是LORR上课吗?你可以从中继承吗?它是其他东西的子类吗?它的MRO是多少?(尝试
LORR.__mro__将其输出,然后将其发布。)如果它是纯python对象,则可能可以将其子类化,创建一个
__setstate__和一个
__getstate__以启用酸洗。
另一种方法可能是弄清楚如何从LORR实例中获取相关数据并通过简单的字符串将其传递。既然你说你确实只是想调用对象的方法,为什么不使用Queues来回发送消息呢?换句话说,是这样的(示意上):
Main Process Child 1 Child 2 LORR 1 LORR 2 child1_in_queue -> get message 'foo' call 'foo' methodchild1_out_queue <- return foo data stringchild2_in_queue -> get message 'bar' call 'bar' methodchild2_out_queue <-



