Python中的多处理与只读共享内存?

Jef*_*eff 0 python multithreading shared-memory multiprocessing

我有一个单线程Python程序,我想修改它以使用它运行的服务器上的所有32个处理器.正如我所设想的那样,每个工作进程都会从队列中接收其作业并将其输出提交到队列.但是,要完成其工作,每个工作进程都需要只读访问复杂的内存中数据结构 - 许多千兆字节的dicts和彼此链接的对象.在python中,有没有一种简单的方法来共享这个数据结构,而不为每个工作进程复制它?

谢谢.

unu*_*tbu 8

如果您正在使用Python的CPython(或PyPy)实现,那么全局解释器锁(GIL)将阻止多个线程一次在Python对象上运行.

因此,如果您使用这样的实现,则需要使用多个进程而不是多个线程来利用您的32个处理器.

您可以使用标准库的多处理concurrent.futures模块来生成工作进程.还有许多第三方选择.Doug Hellman的教程是对多处理模块的一个很好的介绍.

由于您只需要对数据结构进行只读访问,因此如果生成进程之前将复杂数据结构分配给全局变量,则所有进程都可以访问此全局变量.

当您生成进程时,来自调用模块的全局变量将被复制到生成的进程.但是,在具有写时复制功能的 Linux上,生成的进程使用的数据结构完全相同,因此不需要额外的内存.仅当进程修改数据结构时,才会将其复制到新位置.

在Windows上,由于没有fork,每个衍生进程调用python并重新导入调用模块,因此每个进程都需要内存用于其庞大数据结构的单独副本.必须有一些其他方式在Windows上共享数据结构,但我不知道细节.(编辑:POSH可能是共享内存问题的解决方案,但我自己没有尝试过.)