我正在使用Python多处理来产生一些工作者。每个都应该返回一个几MB大小的数组。
我担心我在python如何实现多处理方面存在一些差距,并且试图说服pypy玩得好不会让事情变得更容易。谢谢!
答案 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
创建的大致等效的对象。