如何在完成后但在终止之前使用 psutil.Popen 获得进程 运行 的 cpu_times
How do I get cpu_times of process run with psutil.Popen after it is finished but before it is terminated
我想使用 psutil.Popen
对象的 cpu_times()
方法在它完成 后查找累积值 。我首先尝试了以下方法:
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
p.wait()
cpuTimes = p.cpu_times()
但是,这会导致 NoSuchProcess
异常,因为 wait()
不会 return 直到进程终止。接下来,我尝试在 cpu_times()
wait()
:
之前调用 cpu_times()
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
cpuTimes = p.cpu_times()
p.wait()
但是,这会产生全零的响应。我认为这是因为它在进程启动后立即被调用。因此,我 添加了一个对 time.sleep()
的调用,这将比该过程更持久:
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
time.sleep(15.) # b/c -t 15 in subprocess means it will take 15 seconds
cpuTimes = p.cpu_times()
p.wait()
这实际上产生了 45 秒的预期值(3 个 CPU 以 100% 使用率持续 15 秒)。
但是,对于一般流程,我不知道需要多长时间才能完成。我想避免添加任意长的休眠时间,只是为了确保在我进行查询之前该过程已完成。
有没有办法在不调用 wait()
或 return 进程已终止的其他此类方法的情况下知道进程已完成?
好的,我找到了解决办法。它实际上非常简单,所以我可能应该在发布我的问题之前想到它,但我想这就是这些事情有时的发展方式。
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
cpuTimes = p.cpu_times()
while True:
time.sleep(1e-4)
cpuTimes = p.cpu_times() # Make sure to do this before the call to poll()
retCode = p.poll()
if retCode is not None:
break
在这里,我在启动包含调用的子进程后添加了一个循环
进程的 cpu_times()
和 poll()
方法。
poll()
方法是一种检查子进程是否完成的非阻塞方式。通过在调用 poll()
之前调用 cpu_times()
,将过去一小段时间,因此我们可以考虑最后一次调用 cpu_times()
以产生一个准确的结果。
请注意,如果进程已完成,在 poll()
之后调用 cpu_times()
时会出现异常。这是在调用 poll()
.
之前调用 cpu_times()
的另一个原因
sleep()
方法的参数不是特别重要,但会影响子进程完成后和循环终止前经过的时间。如果子进程从未完成,您可能还可以添加某种慷慨的超时来防止无限循环。
我想使用 psutil.Popen
对象的 cpu_times()
方法在它完成 后查找累积值 。我首先尝试了以下方法:
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
p.wait()
cpuTimes = p.cpu_times()
但是,这会导致 NoSuchProcess
异常,因为 wait()
不会 return 直到进程终止。接下来,我尝试在 cpu_times()
wait()
:
cpu_times()
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
cpuTimes = p.cpu_times()
p.wait()
但是,这会产生全零的响应。我认为这是因为它在进程启动后立即被调用。因此,我 添加了一个对 time.sleep()
的调用,这将比该过程更持久:
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
time.sleep(15.) # b/c -t 15 in subprocess means it will take 15 seconds
cpuTimes = p.cpu_times()
p.wait()
这实际上产生了 45 秒的预期值(3 个 CPU 以 100% 使用率持续 15 秒)。
但是,对于一般流程,我不知道需要多长时间才能完成。我想避免添加任意长的休眠时间,只是为了确保在我进行查询之前该过程已完成。
有没有办法在不调用 wait()
或 return 进程已终止的其他此类方法的情况下知道进程已完成?
好的,我找到了解决办法。它实际上非常简单,所以我可能应该在发布我的问题之前想到它,但我想这就是这些事情有时的发展方式。
p = psutil.Popen("stress --cpu 3 -v -t 15", shell=True)
cpuTimes = p.cpu_times()
while True:
time.sleep(1e-4)
cpuTimes = p.cpu_times() # Make sure to do this before the call to poll()
retCode = p.poll()
if retCode is not None:
break
在这里,我在启动包含调用的子进程后添加了一个循环
进程的 cpu_times()
和 poll()
方法。
poll()
方法是一种检查子进程是否完成的非阻塞方式。通过在调用 poll()
之前调用 cpu_times()
,将过去一小段时间,因此我们可以考虑最后一次调用 cpu_times()
以产生一个准确的结果。
请注意,如果进程已完成,在 poll()
之后调用 cpu_times()
时会出现异常。这是在调用 poll()
.
cpu_times()
的另一个原因
sleep()
方法的参数不是特别重要,但会影响子进程完成后和循环终止前经过的时间。如果子进程从未完成,您可能还可以添加某种慷慨的超时来防止无限循环。