有效地测量流程运行的时间

时间:2016-06-14 21:07:22

标签: python optimization subprocess

我正在尝试计算一个过程的经过时间(跟踪游戏中的时间)。以下代码可以正常工作但不断地使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

1 个答案:

答案 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())

注意:按名称搜索过程可能会导致重复。