将所有内核与 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 多处理池示例,使用3D numpy数组作为输入,在计算密集型堆栈上使用所有CPU内核。
Spacy,在 python 中的大型数据集上使用 nlp.pipe,多处理导致进程进入睡眠状态。如何正确使用所有 CPU 内核?