为何各进程p.cpu_percent()全为0与psutil.cpu_percent()返回值不符?
问题原因
这个现象是psutil库cpu_percent()方法的固有设计导致的,核心原理如下:
psutil计算CPU占用率的逻辑是对比前后两个时间点的CPU耗时差值,换算为对应区间内的占用百分比。- 调用
cpu_percent()时如果不传入interval参数,第一次调用只会记录当前的CPU时间作为基准值,直接返回0.0(进程维度),不会计算真实占用率;只有第二次及之后调用时,才会用当前时间与上一次基准时间对比,返回区间内的真实占用率。 - 你的代码中仅提前调用了全局的
psutil.cpu_percent()生成了全局维度的基准值,所以全局调用返回了正常的占用数值,但所有进程对象的cpu_percent()都是首次被调用,没有对应的历史基准值做差值计算,因此全部返回0.0。
修复方案
有两种常用的修复方式,可按需选择:
方式1:单进程直接统计
调用进程cpu_percent()时传入interval参数,方法会内部阻塞等待指定时长后直接返回该进程的CPU占用率,适合进程数量少的场景:
import psutil print(psutil.cpu_percent()) for p in psutil.process_iter(): try: # interval参数指定统计的时间窗口长度,单位为秒 print(p.name(), p.cpu_percent(interval=0.1)) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass
方式2:批量统计(效率更高)
先批量调用所有进程的cpu_percent()记录基准值,等待固定时长后二次调用获取所有进程的占用率,适合进程数量多的场景:
import psutil import time print(psutil.cpu_percent()) process_list = [] # 第一次调用仅记录基准值,忽略返回结果 for p in psutil.process_iter(): try: p.cpu_percent() process_list.append(p) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass # 等待指定时长作为统计窗口 time.sleep(1) # 第二次调用即可得到窗口内的真实CPU占用率 for p in process_list: try: print(p.name(), p.cpu_percent()) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass
内容的提问来源于stack exchange,提问作者nickcoding2
相关产品推荐
相关产品推荐

