Python - 池不使用所有核心
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 池不使用所有核心相关的知识,希望对你有一定的参考价值。
我正在使用来自Pool
包(multiprocessing
)的from multiprocessing.dummy import Pool
。我写了一个函数,它读取文本文件并为将来的函数预处理它。我有大约20,000个这样的文本文件,因此我想并行化这个过程 - 为此我使用了池。我的远程服务器上有32个运行代码的核心,因此我尝试打开70个进程(我也尝试了更少,问题仍然存在) - 这就是我的系统监视器的样子:
可以看出,32个内核中有16个根本不起作用!
任何帮助,将不胜感激。
正如我在评论中所说,所有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
,如果你在抓取文件时没有进行繁重的后期处理,也不会发现太大的差异。
以上是关于Python - 池不使用所有核心的主要内容,如果未能解决你的问题,请参考以下文章
聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用