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

Python多进程:不使用psutil如何监控子进程的CPU与内存占用

解答你的Python进程监控问题

一、multiprocessing模块是否有内置资源监控功能?

很遗憾,multiprocessing模块本身并没有内置的CPU、内存占用监控能力。它的核心定位是帮你创建、管理进程,以及实现进程间的通信(比如队列、管道)和同步机制,并不提供直接获取进程资源使用情况的API。所以你得借助系统级工具或者读取系统文件来实现监控需求——就像你尝试的用subprocess调用ps命令,或者在Linux环境下直接读取/proc文件系统。

二、解决ps命令输出仅表头的问题

你遇到的输出只有b' %CPU %MEM\n'而没有实际数据的情况,大概率是这几个原因导致的,逐个解决:

1. 未正确替换PID变量

你的代码里写的cmd = "ps -p <P1_pid> -o %cpu,%mem"是占位符写法,实际需要把<P1_pid>替换成真实的进程ID值。推荐用Python的字符串格式化来注入PID:

cmd = f"ps -p {P1_pid} -o %cpu,%mem"

如果想避免shell注入风险,更稳妥的方式是不用shell=True,把命令拆分成列表参数:

MyOut = subprocess.Popen(
    ["ps", "-p", str(P1_pid), "-o", "%cpu,%mem"],
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT
)

2. 进程启动后未留足统计时间

P1刚启动时,系统可能还没来得及收集它的资源使用数据,导致ps暂时获取不到有效统计值。你可以在监控函数里先短暂等待一下:

import time

def monitor_pid(pid):
    time.sleep(0.2)  # 给进程一点初始化时间
    cmd = ["ps", "-p", str(pid), "-o", "%cpu,%mem"]
    result = subprocess.run(cmd, capture_output=True, text=True)
    print(result.stdout)

3. 确认PID的有效性

先打印P1_pid确认它是一个真实存在的进程ID,也可以在终端手动执行ps -p <你的PID>验证,确保进程没有提前退出。

三、替代方案:直接读取/proc文件系统(Linux环境)

如果不想依赖ps命令,在Linux系统下可以直接读取/proc目录下的进程专属文件,效率更高且无需调用外部命令:

  • 读取/proc/{pid}/statm获取内存使用信息(单位是页,需乘以系统页大小转换为字节/MB)
  • 读取/proc/{pid}/stat获取CPU时间数据,结合系统总运行时间计算CPU使用率

举个简单的内存监控例子:

import os

def get_memory_usage(pid):
    try:
        with open(f"/proc/{pid}/statm", "r") as f:
            data = f.read().split()
            resident_pages = int(data[1])  # 常驻内存页数
            page_size = os.sysconf("SC_PAGE_SIZE")  # 系统页大小(字节)
            resident_mb = resident_pages * page_size / (1024 * 1024)  # 转换为MB
            return f"内存占用: {resident_mb:.2f} MB"
    except FileNotFoundError:
        return "进程已终止"

内容的提问来源于stack exchange,提问作者user1452759

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:52:26