multiprocessing - “psutil.Process(PARENT_PID).cpu_percent(interval=0)”在多处理子进程中仅返回“0.0”
问题描述
我有一个需要资源的任务,我想监控进程的 CPU 使用率。我需要 cpu 百分比以高且恒定的速率刷新,这意味着仅在任务内print(psutil.cpu_percent(interval=0))
的各个点添加不是解决方案。我尝试添加一个带有定时循环的并行进程,它测量主进程的资源使用情况并打印出来。我试图将主进程的 PID 传递给子进程并使用它来获取主进程的使用情况,但它似乎不起作用。
这就是我想出的:
system_monitor(process_pid):
while True:
# Timer (waits for the right time to start the loop)
[...]
# Print CPU usage
print(psutil.Process(process_pid).cpu_percent(interval=0))
main():
process_pid = os.getpid()
parallel_process = Process(target=system_monitor, args=(process_pid,))
# Set as daemon so it stops when main process stops
parallel_process.daemon = True
parallel_process.start()
# Resource demanding task
[...]
if __name__ == "__main__":
main()
该代码仅输出0.0
好像它不记得函数的最后一次调用并且每次都重新开始计数。我也尝试了相同的代码,但使用了 RAM ( psutil.Process(process_pid).memory_info().rss
) 并且效果很好。
解决方案
我不知道你是否还在寻找答案,但我遇到了同样的问题,我想我已经解决了。它不起作用,因为您每次调用时都在重新创建流程print(psutil.Process(process_pid).cpu_percent(interval=0))
。
相反,您应该创建一次流程对象p = psutil.Process(process_pid)
,然后您就可以调用p.cpu_percent(interval=0))
(不包括始终返回 0的第一个调用)。
我认为它使用的原因psutil.Process(process_pid).memory_info().rss
是因为memory_info()
它的工作方式与cpu_percent()
. memory_info()
为您提供实时内存使用情况,同时cpu_percent(interval=0)
为您提供自上次调用以来的百分比(除非您将大于 0 的值传递给 interval)。
推荐阅读
- bash - 退出表单 shell 脚本未按预期工作
- multithreading - NativeScript 中的多线程不起作用
- python - Pandas:使用 if 语句更新列
- powershell - 检测重复的文件夹名称(在文件夹扩展之前)
- android - 解析未为 _User 表调用的 SubscriptionHandling 句柄事件
- node.js - 更新到版本 1.18.10 后 Nodemon 无法正常工作
- excel - 根据日期选择动态范围并在范围内粘贴公式
- fortran - 了解在 fortran 中使用 BIND(C) 的基础知识
- android - MediaStore.Images.Media.getBitmap 需要太多时间
- java - 如何在作业中输入参数