将所有内核与 python 多处理一起使用

Posted

技术标签:

【中文标题】将所有内核与 python 多处理一起使用【英文标题】:Use all cores with python multiprocessing 【发布时间】:2022-01-18 11:51:31 【问题描述】:

我编写了一个用于测试的 sn-p 以使用多处理来处理我笔记本电脑的所有内核。我有一个8核CPU。在(基本)代码下方:

import os
import time
import multiprocessing


def worker(n):
    pid = os.getpid()
    for x in range(0, 10):
        print("PID: %s   INPUT: %s" % (str(pid), str(n)))
        time.sleep(2)


input_params_list = [1, 2, 3, 4, 5, 6, 7, 8]
pool = multiprocessing.Pool(8)
pool.map(worker, input_params_list)
pool.close()
pool.join()

基本上它应该启动 8 个进程,这些进程应该只打印它们的 pid 和它们作为输入参数获得的整数。我只是添加了一个 sleep 来引入一些延迟并让所有这些都并行运行。当我运行脚本时,这就是我得到的:

PID: 811   INPUT: 1
PID: 812   INPUT: 2
PID: 813   INPUT: 3
PID: 814   INPUT: 4
PID: 815   INPUT: 5
PID: 816   INPUT: 6
PID: 817   INPUT: 7
PID: 818   INPUT: 8
PID: 811   INPUT: 1
PID: 812   INPUT: 2
PID: 813   INPUT: 3
PID: 814   INPUT: 4
PID: 815   INPUT: 5
PID: 816   INPUT: 6
PID: 817   INPUT: 7
PID: 818   INPUT: 8
... ... ... ... ...
... ... ... ... ...

我看到我有 8 个不同的进程(加上“父亲”)同时运行。问题是我认为它们没有在 8 个不同的内核上运行。这是我从 htop 得到的(我也和 top 一样):

据我了解,CPU 列应包含进程正在运行的内核数。在这种情况下,我认为某些东西没有按预期工作,因为它们都是 1。否则我想我的代码中有什么我误解或有问题的地方。

【问题讨论】:

time.sleep(2) 意味着在大多数情况下,这些进程根本没有运行。这就是CPU% 列所显示的:使用 CPU 的时间减少了 0.1%。操作系统无需在单独的内核上运行它们。 【参考方案1】:

宫城先生是对的。为了显示 CPU 正在工作,我稍微更改了您的代码,并添加了一些 CPU 绑定任务来计算一个大数的阶乘以持续几秒钟(CPU 着火了)。另外,我使用私有变量_identity 来查看worker 运行在哪个内核上。

import os
import time
import multiprocessing
import numpy as np

def worker(n):
    factorial = np.math.factorial(900000)
    # rank = multiprocessing.current_process().name one can also use
    rank = multiprocessing.current_process()._identity[0]
    print(f'I am processor rank, got n=n, and finished calculating the factorial.')


cpu_count = multiprocessing.cpu_count()
input_params_list = range(1, cpu_count+1)


pool = multiprocessing.Pool(cpu_count)
pool.map(worker, input_params_list)
pool.close()
pool.join()

输出

I am processor 4, got n=4, and finished calculating the factorial.
I am processor 2, got n=2, and finished calculating the factorial.
I am processor 1, got n=1, and finished calculating the factorial.
I am processor 3, got n=3, and finished calculating the factorial.

【讨论】:

以上是关于将所有内核与 python 多处理一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Python中的多处理不使用所有内核

无法将所有内核与 mpirun 一起使用

在多处理中如何将 CPU 内核分配给 python 进程?

python 多处理池示例,使用3D numpy数组作为输入,在计算密集型堆栈上使用所有CPU内核。

Spacy,在 python 中的大型数据集上使用 nlp.pipe,多处理导致进程进入睡眠状态。如何正确使用所有 CPU 内核?

WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用