gpt4 book ai didi

python - 具有只读共享内存的 Python 中的多处理?

转载 作者:行者123 更新时间:2023-12-03 12:44:53 27 4
gpt4 key购买 nike

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

谢谢。

最佳答案

如果您使用的是 Python 的 CPython(或 PyPy)实现,那么 global interpreter lock (GIL)将阻止多个线程一次对 Python 对象进行操作。

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

您可以使用标准库的 multiprocessingconcurrent.futures产生工作进程的模块。还有many third-party options . Doug Hellman's tutorial是对多处理模块的一个很好的介绍。

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

当你生成一个进程时,来自调用模块的全局变量被复制到生成的进程中。但是,在具有 copy-on-write 的 Linux 上,生成的进程使用完全相同的数据结构,因此不需要额外的内存。只有当一个进程修改了数据结构时,它才会被复制到一个新的位置。

在 Windows 上,由于没有 fork ,每个生成的进程都会调用 python 并重新导入调用模块,因此每个进程都需要内存来存储自己的庞大数据结构的单独副本。必须有其他方式在 Windows 上共享数据结构,但我不知道细节。 (编辑: POSH may be a solution to the shared-memory problem ,但我自己没有尝试过。)

关于python - 具有只读共享内存的 Python 中的多处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19366259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com