Получить время выполнения подпроцесса python - PullRequest
0 голосов
/ 19 сентября 2019

Я использую python для одновременного запуска нескольких подпроцессов.

Я хочу получить время выполнения каждого процесса.

Я использую модуль subprocess.

Что я сделал: я создал два отдельных цикла for: первый для запуска каждого процесса, второй ждет завершения всех процессов.

for prcs in batch:
    p = subprocess.Popen([prcs])
    ps.append(p)
for p in ps:
    p.wait()

Этот код отлично работает для одновременного запуска процессов,но я не знаю, что добавить к нему, чтобы получить время выполнения каждого процесса отдельно.

Редактировать: Есть ли способ получить время выполнения через подпроцесс модуля?Например: runtime = p.runtime ()

1 Ответ

1 голос
/ 19 сентября 2019

Я согласен с @quamrana, что самый простой способ сделать это с потоками.

Во-первых, нам нужно импортировать некоторые стандартные библиотечные модули:

import collections
import subprocess
import threading
import time

Вместо спискадля хранения процессов мы используем упорядоченный словарь, чтобы отслеживать процессы и их время.Поскольку мы не знаем, сколько времени займет каждый поток, нам нужен какой-то способ, чтобы отслеживать исходный порядок наших пар {process: time}.Сами потоки могут быть сохранены в списке.

ps = collections.OrderedDict()
ts = []

Инициализация значения, связанного с каждым процессом, так как текущее время делает все более чистым, несмотря на то, что обычно не рекомендуется использовать одну и ту же переменную длядве разные вещи (в данном случае время запуска, а затем продолжительность процесса).Цель для нашего потока просто ждет окончания потока и обновляет упорядоченный словарь ps от времени начала до продолжительности процесса.

def time_p(p):
    p.wait()
    ps[p] = time.time() - ps[p]

for prcs in batch:
    p = subprocess.Popen([prcs])
    ps[p] = time.time()
    ts.append(threading.Thread(target=time_p, args=(p,)))

Теперь мы просто запускаем каждый из потоков, затем ждем ихвсе для завершения.

for t in ts:
    t.start()

for t in ts:
    t.join()

После того, как все они завершены, мы можем распечатать результаты для каждого:

for prcs, p in zip(batch, ps):
    print('%s took %s seconds' % (prcs, ps[p]))
...