如何使Python的多进程派生以使用所有可用的cpu

2024-04-30 02:28:44 发布

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

我有一个AWS实例有32个CPU:

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

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

例如下面的代码,每个命令是否会在每个可用的CPU上运行?在

^{pr2}$

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

如果我设置池大小处理器(CPU)会怎么样?在


Tags: 实例代码命令ipaws利用ubuntuproc
2条回答

首先对你的措辞稍作修改。一个CPU有不同的核心,每个核心都有超线程。每个超线程都是运行处理器的逻辑单元。亚马逊上有32个vCPU对应于超线程,而不是CPU或内核。这对这个问题并不重要,但只是为了以防万一,如果你做任何进一步的研究,重要的是要有正确的措辞。下面我将把hypertrade的这个“最低逻辑处理单元”称为vCPU

如果不指定池大小:

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

然后python将自己(通过os.cpu_count())找出可用逻辑处理器(在您的例子中是32个vcpu)的数量。在

在正常情况下,所有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绑定的,但例如磁盘绑定(需要等待磁盘读/写)或网络绑定(例如,等待其他服务器应答),那么调度程序会将它们切换出去,以便为另一个进程腾出空间,因为它们无论如何都需要等待。在

简单的问题是“不完全是”。您可以使用os.cpu_count()函数获取cpu计数并运行此数量的进程。但只有操作系统将进程分配给CPU。更重要的是,它可能会在一段时间内切换到另一个cpu。这里我不解释preemptive multitasking是如何工作的。在

如果您有其他“重”进程运行在这个服务器上-例如数据库或甚至web服务器-他们可能需要一些cpu时间来执行。在

一些好消息是,存在一个名为Process Affinity的东西,可以满足您的需要。但这是对操作系统的微调。在

相关问题 更多 >