首页 > 解决方案 > “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) 并且效果很好。

标签: multiprocessingcpu-usagepidmonitorpsutil

解决方案


我不知道你是否还在寻找答案,但我遇到了同样的问题,我想我已经解决了。它不起作用,因为您每次调用时都在重新创建流程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)。


推荐阅读