Печать отчета о состоянии асинхронной задачи в PythonPython

Программы на Python
Ответить
Anonymous
 Печать отчета о состоянии асинхронной задачи в Python

Сообщение Anonymous »

У меня есть скрипт Python, который использует многопроцессорность для запуска функции с заданными аргументами и печатает, когда она запускается, когда заканчивается и сколько времени это заняло. Если предположить простой случай, код будет выглядеть примерно так:

Код: Выделить всё

import concurrent.futures
import datetime

def do_stuff(arg):
start_time = datetime.now()
# do stuff
end_time = datetime.now()

return f"Finished task with arg {arg} in {end_time-start_time}"

if __name__ == '__main__':
with concurrent.futures.ProcessPoolExecutor() as executor:
results = []

for arg in args: # args is a list of arguments to be passed
print(f"Starting task with arg {arg}")
results.append(executor.submit(do_stuff, arg))

for f in concurrent.futures.as_completed(results):
print(f.result())
Предположим, что передаваемыми аргументами являются arg1, arg2, arg3 и arg4, а также начало и конец задач. происходит в следующем порядке:
  • Запуск задачи с аргументом 1
  • Задача с аргументом 2 начинается
  • Задача с arg3 начинается
  • Задача с arg2 завершается
  • Задача с arg4 начинается
  • Задача с аргументом 1 завершается
  • Задача с аргументом 4 завершается
  • Задача с arg3 завершается
Терминал должен заканчиваться примерно следующим образом:

Код: Выделить всё

Starting task with arg arg1
Starting task with arg arg2
Starting task with arg arg3
Finished task with arg arg2 in mm:ss
Starting task with arg arg4
Finished task with arg arg1 in mm:ss
Finished task with arg arg4 in mm:ss
Finished task with arg arg3 in mm:ss
Мне нужен способ сообщать о начале и завершении задачи в одной строке, чтобы терминал выглядел следующим образом на каждом этапе.
  • Задача с аргументом 1 запускается

    Код: Выделить всё

    Starting task with arg arg1
    
  • Задача с arg2 запускается

    Код: Выделить всё

    Starting task with arg arg1
    Starting task with arg arg2
    
  • Задача с arg3 запускается

    Код: Выделить всё

    Starting task with arg arg1
    Starting task with arg arg2
    Starting task with arg arg3
    
  • Задача с arg2 завершается

    Код: Выделить всё

    Starting task with arg arg1
    Starting task with arg arg2 - finished in mm:ss
    Starting task with arg arg3
    
  • Задача с аргументом 4 запускается

    Код: Выделить всё

    Starting task with arg arg1
    Starting task with arg arg2 - finished in mm:ss
    Starting task with arg arg3
    Starting task with arg arg4
    
  • Задача с аргументом 1 завершается

    Код: Выделить всё

    Starting task with arg arg1 - finished in mm:ss
    Starting task with arg arg2 - finished in mm:ss
    Starting task with arg arg3
    Starting task with arg arg4
    
  • Задача с аргументом 4 завершается

    Код: Выделить всё

    Starting task with arg arg1 - finished in mm:ss
    Starting task with arg arg2 - finished in mm:ss
    Starting task with arg arg3
    Starting task with arg arg4 - finished in mm:ss
    
  • Задача с arg3 завершается

    Код: Выделить всё

    Starting task with arg arg1 - finished in mm:ss
    Starting task with arg arg2 - finished in mm:ss
    Starting task with arg arg3 - finished in mm:ss
    Starting task with arg arg4 - finished in mm:ss
    
Я знаю, что существуют escape-коды ANSI, которые позволяют мне перемещать курсор вверх и вниз, но мне придется сохраняйте где-нибудь положение строки каждой задачи, чтобы после ее завершения курсор мог вернуться обратно на эту строку и переписать текст. Мне также нужно было бы каким-то образом отслеживать «текущую» линию, чтобы знать, насколько нужно подняться вверх и насколько вниз. Но это похоже на боль, и мне интересно, что уже существует что-то для такого типа вещей. Любая помощь приветствуется.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»