在python多处理中从子进程返回大对象

时间:2014-10-22 18:07:36

标签: python multiprocessing pypy python-multiprocessing

我正在使用Python多处理来产生一些工作者。每个都应该返回一个几MB大小的数组。

  1. 是否正确,因为我的返回数组是在子进程中创建的,所以当进程结束时需要将其复制回父进程的内存中? (这似乎需要一段时间,但这可能是一个小问题)
  2. 是否有机制允许父级和子级访问相同的内存中对象? (同步不是问题,因为只有一个孩子可以访问每个对象)
  3. 我担心我在python如何实现多处理方面存在一些差距,并且试图说服pypy玩得好不会让事情变得更容易。谢谢!

1 个答案:

答案 0 :(得分:6)

是的,如果在子进程中创建了返回数组,则必须通过pickle将其发送给父进程,通过Pipe将pickle字节发送回父进程,然后取消对该进程的修改。家长。对于一个大型对象,这在CPython中相当慢,所以它不仅仅是一个PyPy问题。但是,PyPy中的性能可能更糟;我没有尝试比较两者,但this PyPy bug似乎表明PyPy中的multiprocessing比CPython慢​​。

在CPython中,有一种方法可以通过multiprocessing.sharedctypes在共享内存中分配ctypes个对象。 PyPy似乎也支持这个API。限制(显然)是您被限制为ctypes个对象。

还有multiprocessing.Manager,它允许您在Manager进程中创建共享数组/列表对象,然后父和子都可以通过{{1}访问共享列表对象。缺点是对象的读/写性能比作为本地对象要慢得多,或者即使它是使用Proxy创建的大致等效的对象。