gpt4 book ai didi

python - 如何使 Python 的多进程生成以利用所有可用的 CPU

转载 作者:行者123 更新时间:2023-12-01 03:16:19 24 4
gpt4 key购买 nike

我有一个具有 32 个 CPUS 的 AWS 实例:

ubuntu@ip-122-00-18-114:~$ cat /proc/cpuinfo  | grep processor  | wc -l
32

我的问题是如何利用Python的multiprocessing以便每个命令在每个 CPU 上运行。

例如,使用以下代码,每个命令都会在每个可用的 CPU 上运行吗?

import multiprocessing
import os
POOL_SIZE = 32
cmdlist = []
for param in items:
cmd = """./cool_command %s""" % (param)
cmdlist.append(cmd)
p = multiprocessing.Pool(POOL_SIZE)
p.map(os.system, cmdlist)

如果没有,正确的方法是什么?

如果我设置 POOL_SIZE > # 个处理器 (CPU) 会发生什么?

最佳答案

首先对你的措辞进行一些修正。 CPU有不同的核心,每个核心都有超线程。每个超线程是运行处理器的逻辑单元。在 Amazon 上,您有 32 个 vCPU,它们对应于超线程,而不是 CPU 或内核。这对于这个问题并不重要,但以防万一您进行进一步的研究,措辞正确很重要。我将把这个超线程的“最低逻辑处理单元”称为下面的 vCPU

如果您不指定池大小:

p = multiprocessing.Pool()
p.map(os.system, cmdlist)

然后Python将找出可用逻辑处理器的数量(在你的例子中是32个vCPU)本身(通过os.cpu_count())。

在正常情况下,所有 32 个进程都在单独的 vCPU 上运行,因为 Linux 试图在它们之间均匀地平衡负载。但是,如果同时运行其他繁重的进程,则两个进程可能会在同一个 vCPU 上运行。

这里要理解的关键是 Linux 调度程序的工作原理:它定期重新调度进程,以便所有处理单元的利用率大致相同。这意味着,如果您仅启动 16 个进程,那么它们将分布到所有 32 个 vCPU 上,并以相同的方式利用它们(使用 htop 查看负载分布情况)。

And what happened if I set POOL_SIZE > # Processors (CPUs)?

如果启动的进程多于可用的 vCPU,则一些进程需要共享一个 vCPU。这意味着调度程序会在上下文切换中定期切换进程。如果您的进程受 CPU 限制(使用 100% cpu,例如,当您进行数字运算时),那么进程数多于 vCPU 会减慢整个进程的速度,因为上下文切换会减慢速度,并且进程之间有通信(不是在您的示例中,而是您在进行多处理时通常会做的事情)这也会减慢速度。

但是。如果您的进程不受 CPU 限制,但例如磁盘绑定(bind)(需要等待磁盘读/写)或网络绑定(bind)(例如等待其他服务器应答),然后它们被调度程序切换出去,为另一个进程腾出空间,因为它们无论如何都需要等待。

关于python - 如何使 Python 的多进程生成以利用所有可用的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42439882/

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