Python池并不使用所有的核心

2024-05-13 03:31:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用来自multiprocessing包(from multiprocessing.dummy import Pool)的Pool。 我编写了一个函数,它读取一个文本文件并为将来的函数进行预处理。 我有大约20000个这样的文本文件,因此我想并行化这个过程——为此,我使用了池。 我在运行代码的远程服务器上有32个内核,因此我尝试打开70个进程(我也尝试了较少的进程,问题仍然存在)-这就是我的系统监视器的样子:

enter image description here

可以看到,32个核中有16个根本不工作!你知道吗

任何帮助都将不胜感激。你知道吗


Tags: 函数代码fromimport服务器远程进程过程
1条回答
网友
1楼 · 发布于 2024-05-13 03:31:56

正如我在评论中所说的,所有^{}结构都是为了模拟多处理接口,使用常规线程,这对于测试、调试、分析等非常有用。或者,正如官方文档所说:

multiprocessing.dummy replicates the API of multiprocessing but is no more than a wrapper around the threading module.

虽然Python(CPython)^{}使用真正的系统线程,因此理论上可以让线程代码在不同的cpu上执行,但是由于可怕的GIL,这些线程中没有两个会同时运行。这条规则也有例外,tho—所有抽象系统调用并等待事件(如I/O)的任务都可以并行执行,但当处理移动到Python域时,它将被GIL锁定,并且在opt code计数器切换其上下文之前不允许继续执行。你知道吗

长话短说,如果您想通过^{}池使用多个内核,请不要使用^{}(对于其他dummy包也是如此)中的改编和抽象,并使用根^{}模块本身—在您的示例中是^{}。你知道吗

也就是说,考虑到^{}模块没有池接口,我发现自己经常使用multiprocessing.dummy.Pool(或multiprocessing.pool.ThreadPool)来代替I/O繁重的东西(即不受GIL限制),因为共享内存比共享处理更重要,而且它会产生开销。很可能,即使切换到^{},如果在获取文件时不进行大量的后处理,也不会注意到太大的差异。你知道吗

相关问题 更多 >