gpt4 book ai didi

Python - 池不使用所有内核

转载 作者:太空宇宙 更新时间:2023-11-04 04:39:22 25 4
gpt4 key购买 nike

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

enter image description here

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

如有任何帮助,我们将不胜感激。

最佳答案

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

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

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

长话短说,如果您想通过 multiprocessing 使用多个内核池,不要使用 multiprocessing.dummy 中的改编和抽象(这也适用于其他 dummy 包)并使用根目录 multiprocessing模块本身 - 在你的例子中,multiprocessing.pool.Pool .

也就是说,考虑到 threading模块没有池接口(interface) 我经常发现自己使用 multiprocessing.dummy.Pool(或 multiprocessing.pool.ThreadPool)代替 I/O 繁重的东西(即不受 GIL 限制)当共享内存比共享 处理及其产生的开销更重要时。即使切换到 multiprocessing.pool.Pool 也很有可能如果您在抓取文件时不进行繁重的后处理,您将不会注意到太大的差异。

关于Python - 池不使用所有内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51008636/

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