如何有效地共享占用大内存并在python多进程中频繁更改的用户定义对象?

时间:2016-01-10 03:43:39

标签: python multiprocessing shared-memory

我已经尝试过模块多处理管理器和数组,但它无法满足我的需求 有没有像linux C中的共享内存一样的方法?

1 个答案:

答案 0 :(得分:2)

不是这样

在一般情况下共享这样的内存是非常棘手的。 CPython解释器不重定位对象,因此必须在共享内存区域内创建 in situ 。这意味着共享内存分配,这比仅调用PyMem_Malloc()要复杂得多。按照增加的难度顺序,您需要跨进程锁定,每进程引用计数以及某种进程间循环垃圾收集。最后一个是非常难以高效安全地完成。确保共享对象仅引用其他共享对象也是必要的,如果您不愿意将对象重定位到共享区域,这很难做到。因此,Python没有提供将任意完整的Python对象填充到共享内存中的通用方法。

但是您可以在进程之间共享mmap个对象,mmap支持缓冲区协议,因此您可以将其包含在更高级别的内容中,例如array / numpy.ndarray或其他任何有buffer protocol支持的内容。根据您的精确模态,您可能必须编写少量的C或Cython胶水代码,以便在mmap和数组之间快速移动数据。如果您正在使用NumPy,则不需要这样做。请注意,高级对象可能需要锁定mmap不提供。