"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
我有一项资源要求很高的任务,我想监控 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