Python - 池不使用所有核心

问题描述 投票:2回答:1

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

enter image description here

可以看出,32个内核中有16个根本不起作用!

任何帮助,将不胜感激。

python multithreading performance multiprocessing remote-server
1个回答
1
投票

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

multiprocessing.dummy复制了multiprocessing的API,但它只不过是threading模块的包装器。

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

简而言之,如果你想通过multiprocessing池使用多个核心,不要使用multiprocessing.dummy中的改编和抽象(对于其他dummy包也是如此)并使用根multiprocessing模块本身 - 在你的情况下,multiprocessing.pool.Pool

话虽如此,鉴于threading模块没有池接口我经常发现自己使用multiprocessing.dummy.Pool(或multiprocessing.pool.ThreadPool)代替I / O重物(即不受GIL限制)共享内存比共享更重要处理和它产生的开销。很有可能即使切换到multiprocessing.pool.Pool,如果你在抓取文件时没有进行繁重的后期处理,也不会发现太大的差异。

© www.soinside.com 2019 - 2024. All rights reserved.