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
相关产品推荐
相关产品推荐

