我正在尝试计算一个过程的经过时间(跟踪游戏中的时间)。以下代码可以正常工作但不断地使CPU忙碌。 我想这与while循环不断轮询以检查进程是否仍在运行有关。有没有更有效的方法来实现这个?
def is_running(process_name):
try:
subprocess.check_output(['pidof', process_name])
return True
except subprocess.CalledProcessError:
return False
def monitor_process(process_name):
while True:
if is_running(process_name):
start_time = time.time()
while is_running(process_name):
pass
return round(time.time() - start_time, 3)
else:
pass
答案 0 :(得分:2)
您应该使用psutil(python系统和流程实用程序) 搜索正在运行的进程。
请注意,pidof
命令仅适用于基于Linux的系统,
Unix用户可以尝试ps
命令或pgrep
命令来查找正在运行的程序的pid。
此命令在Windows上不存在。
import psutil
def filter_by_name(process_name):
for process in psutil.process_iter():
try:
if process.name() == process_name:
yield process
except psutil.NoSuchProcess:
pass
def is_running(process_name):
return any(p for p in filter_by_name(process_name))
process_name = "Mail"
if is_running(u"{0}".format(process_name)):
print(u"{0} is running.".format(process_name))
else:
print(u"Bad new, {0}'s dead!".format(process_name))
使用无限循环是耗费资源的
并检查给定进程是否正在运行。真的效率低下!
至少,使用time.sleep(sec)
在每次迭代之间进行一次小的暂停。
再次,psutil
可以帮助你!
如果您获得psutil.process_iter()
或我们的流程
filter_by_name()
函数,您可以等待进程终止。
只需使用wait()
方法timeout
(以秒为单位)。
然后,当过程结束时,
您可以减去当前时间和create_time()
来获取进程持续时间(以秒为单位)。
import time
for p in filter_by_name(process_name):
p.wait(timeout=10)
print(time.time() - p.create_time())
注意:按名称搜索过程可能会导致重复。