"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)为您提供自上次调用以来的百分比(除非您向interval传递了大于0的值(。

非常感谢昆汀,它成功了。基本上,您需要从psutil获取一次所有进程句柄,并在其上运行一次cpu_percent。然后在循环中,您可以使用psutil进程句柄并调用cpu_percent。第一个样本是0.0,但其余的cpu百分比是相关值>0.0

相关内容

  • 没有找到相关文章

最新更新