我正在使用 Python 多处理来产生一些工人。它们中的每一个都应该返回一个大小为几 MB 的数组。
- 由于我的返回数组是在子进程中创建的,因此在进程结束时需要将其复制回父内存中是否正确?(这似乎需要一段时间,但这可能是一个 pypy 问题)
- 是否有一种机制允许父母和孩子访问同一个内存对象?(同步不是问题,因为只有一个孩子可以访问每个对象)
恐怕我在 python 如何实现多处理方面存在一些差距,并且试图说服 pypy 玩得好并不会让事情变得更容易。谢谢!
我正在使用 Python 多处理来产生一些工人。它们中的每一个都应该返回一个大小为几 MB 的数组。
恐怕我在 python 如何实现多处理方面存在一些差距,并且试图说服 pypy 玩得好并不会让事情变得更容易。谢谢!
是的,如果返回数组是在子进程中创建的,则必须通过酸洗将其发送给父级,通过 a 将酸洗后的字节发送回父Pipe
级,然后在父级中取消酸洗对象。对于一个大对象,这在 CPython 中相当慢,所以这不仅仅是一个 PyPy 问题。不过,PyPy的性能可能会更差;我没有尝试比较两者,但这个 PyPy 错误似乎表明multiprocessing
PyPy 比 CPython 慢。
在 CPython 中,有一种方法可以ctypes
在共享内存中分配对象,通过multiprocessing.sharedctypes
. PyPy 似乎也支持这个 API。限制(显然)是您仅限于ctypes
对象。
还有multiprocessing.Manager
,它可以让你在进程中创建一个共享数组/列表对象Manager
,然后父母和孩子都可以通过一个Proxy
对象访问共享列表。缺点是对象的读/写性能比作为本地对象要慢得多,或者即使它是使用multiprocessing.sharedctypes
.