You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何各进程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 12:06:03