Как найти время выполнения нескольких подпроцессов? - PullRequest
0 голосов
/ 26 мая 2018

У меня есть список команд Linux, и я выполняю каждую команду, используя модуль подпроцесса, мне нужно выяснить, как найти время выполнения каждой из команд и вернуть время выполнения в списке или в тексте, вв случае dict ключом может быть имя команды, а значением - время в секундах.

, т. е. Момент (Popen object).poll() == 0 завершается, должен определять время окончания.

IИспользую Python 3.5.2

Например:

import time
import shlex
from subprocess import *`

#list of commands
commands = ['sleep 5', 'ls -l', 'find /usr','sleep 3','uptime']

#executing each command in the list
for command in commands:
     cmd = shlex.split(command)
     # Need to time this and the moment it is finished executing.
     x = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)

Должен вернуться / напечатать:

- Commands   Time(secs)
- sleep 5     5.0004   #whatever the time it takes
- ls -l       0.000    #and so on....

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Хотя потоки, безусловно, являются решением этой проблемы (при условии правильной обработки общих данных), вы можете в качестве альтернативы запустить цикл while:

import time
import shlex
from subprocess import *

#list of commands
commands = ['sleep 5', 'ls -l', 'sleep 3', 'uptime', 'find /usr']
times = {}
running = {}
#executing each command in the list
for command in commands:
    start_time = time.time()
    cmd = shlex.split(command)
    times[command] = time.time()
    running[command] = Popen(cmd,
                             # no shell=True, shlex already did the split
                             stdout=PIPE, stderr=PIPE)

while len(running):
    finished = set()
    for cmd, proc in running.items():
        if proc.poll() is not None:
            times[cmd] = time.time() - times[cmd]
            finished.add(cmd)
        else:
            proc.communicate() # drain the pipe

    for cmd in finished:
        del running[cmd]

print(times)

Обратите внимание, что он не будет блокироваться (в отличие от его многопоточности).альтернатива), так что это может в конечном итоге съесть ваш процессор.Чтобы уменьшить нагрузку, вы можете добавить вызов к time.sleep в конце цикла, делая результаты немного неточными.

Редактировать: так как вы использовали каналы в примере, я предполагаю, что вы хотите использоватьвывод (некоторых) команд для некоторой значимой обработки.Независимо от того, хотите вы этого или нет, если вы не выполните proc.communicate, вы закончите заполнять свою трубу, блокируя процесс.Кроме того, вы можете, конечно, перенаправить вывод (в какой-нибудь файл или / dev / null).Связь с процессом может также изменить результаты, как и обработка:)

0 голосов
/ 26 мая 2018

Popen - это техника «беги на заднем плане» бедняка.У вас есть контроль над процессом, но если вы хотите дождаться его завершения без опроса, вы не сможете.

, если вам не нужны выходные данные, только время выполнения, вы можетеОберните каждый subprocess.call (Popen больше не нужен) в потоке и обновите словарную команду => потраченное время

Запуск потока не блокирует, а call блокирует, позволяя вам рассчитать времявыполнение проще.

import threading,time,subprocess,shlex

time_dict = {}

def time_me(command):
    start_time = time.time()
    cmd = shlex.split(command)
    subprocess.call(cmd)
    time_dict[command] = time.time() - start_time

threads = []
commands = ['sleep 5', 'ls -l', 'find /usr','sleep 3','uptime']

for command in commands:
    t = threading.Thread(target=time_me,args=(command,))
    t.start()
    threads.append(t)

for t in threads:
    t.join()

print(time_dict)
...