【问题标题】:"psutil.Process(PARENT_PID).cpu_percent(interval=0)" returns only "0.0" in multiprocessing subprocess“psutil.Process(PARENT_PID).cpu_percent(interval=0)”在多处理子进程中仅返回“0.0”
【发布时间】:2019-11-19 20:09:51
【问题描述】:

我有一个需要资源的任务,我想监控进程的 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),效果很好。

【问题讨论】:

    标签: multiprocessing cpu-usage pid monitor psutil


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        • 2020-06-19
        • 2014-11-01
        • 1970-01-01
        • 2021-03-27
        相关资源
        最近更新 更多