"psutil.Process(PARENT_PID).cpu_percent(interval=0)" returns 在多处理子进程中只有“0.0”

"psutil.Process(PARENT_PID).cpu_percent(interval=0)" returns only "0.0" in multiprocessing subprocess

我有一项资源要求很高的任务,我想监控 CPU 进程的使用情况。我需要 cpu 百分比以高刷新率和 恒定 率,这意味着只需在 内部 [=25] 的不同点添加 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))(不包括第一个 will always return 0 的调用)。

我认为它与 psutil.Process(process_pid).memory_info().rss 一起工作的原因是因为 memory_info()cpu_percent() 的工作方式不同。 memory_info() 为您提供实时内存使用情况,而 cpu_percent(interval=0) 为您提供自上次调用以来的百分比(除非您通过了 a value greater than 0 to interval)。

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