我有一项需要资源的任务,我想监控进程的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