如何用Python测量进程A及其所有子孙进程的CPU使用率
如何用Python测量进程A及其所有子孙进程的CPU使用率快照
要实现这个需求,我们可以借助psutil库(跨平台进程监控工具)来遍历进程树并统计CPU使用率,以下是具体步骤和代码实现:
1. 安装依赖库
首先需要安装psutil,它是处理进程相关操作的首选Python库:
pip install psutil
2. 核心实现步骤
2.1 遍历进程树
通过进程A的PID,我们可以直接获取它的所有子孙进程。psutil提供了内置方法来获取整个进程树,无需手动递归。
2.2 统计整体CPU使用率
CPU使用率是一段时间内的统计值,不存在绝对的“瞬时快照”,我们可以通过短时间窗口内的CPU时间差计算平均使用率,以此近似快照值。
3. 完整代码示例
import psutil import time from multiprocessing import Process def process_a_func(): # 示例:进程A的业务逻辑,可在此创建子进程 time.sleep(5) def get_process_tree(pid): """获取指定PID及其所有子孙进程的Process对象""" try: parent_proc = psutil.Process(pid) # 包含父进程本身 + 所有递归子进程 process_list = [parent_proc] + parent_proc.children(recursive=True) return process_list except psutil.NoSuchProcess: print(f"错误:进程 {pid} 不存在") return [] def calculate_total_cpu(processes, interval=0.1): """计算进程列表的总CPU使用率""" if not processes: return 0.0 # 初始化CPU使用率统计(第一次调用返回0,用于后续对比) for proc in processes: try: proc.cpu_percent(interval=None) except (psutil.NoSuchProcess, psutil.AccessDenied): pass time.sleep(interval) total_usage = 0.0 for proc in processes: try: # 获取自上次调用以来的CPU使用率 usage = proc.cpu_percent(interval=None) total_usage += usage except (psutil.NoSuchProcess, psutil.AccessDenied): # 忽略已退出或无权限访问的进程 continue return total_usage if __name__ == "__main__": # 启动进程A proc_a = Process(target=process_a_func) proc_a.start() # 等待进程A完成初始化 time.sleep(0.5) # 获取进程A的完整进程树 process_tree = get_process_tree(proc_a.pid) # 计算总CPU使用率 total_cpu_usage = calculate_total_cpu(process_tree) print(f"进程A及其所有子孙进程的总CPU使用率:{total_cpu_usage:.2f}%") # 清理进程 proc_a.join()
关键说明
- CPU使用率的含义:返回的总使用率是所有进程的CPU使用率之和,例如在4核CPU上,两个满负荷运行的进程总使用率为200%。
- 异常处理:测量过程中可能出现进程退出、无权限访问等情况,需捕获
psutil.NoSuchProcess和psutil.AccessDenied异常。 - 间隔时间调整:
interval参数控制统计窗口的长度,值越小越接近“快照”,但过小会增加统计误差,推荐设置为0.1-1秒。 - 跨平台支持:
psutil兼容Windows、Linux、macOS等主流操作系统,无需针对不同系统修改代码。
内容的提问来源于stack exchange,提问作者konchy
相关产品推荐
相关产品推荐

