Я согласен с @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]))