Рубрики
Без рубрики

Одновременные фьючерсы и показывая прогресс

Я сделал несколько обновлений Густаво: один майор; один несовершеннолетний; И некоторые рефакторинг …. Теги с Opensource, Python.

Я сделал несколько обновлений Густаво: один майор; один несовершеннолетний; и некоторые рефакторинг.

Slaterslater/Gustavo

Распечатайте колорированный отчет всех HTTP URL в файле

Этот проект является одним из моих первых раз, работающих с Python, и я был действительно впечатлен тем, насколько легко реализовать резьбу. После импорта chapulent.futures Я обнаружил, что используя понимание списка действительно сделано для элегантного решения.

with concurrent.futures.ThreadPoolExecutor() as executor:
  results = [executor.submit(get_status, url) for url in urlist]

Это все, что нужно было экспоненциально улучшить производительность. Первая строка создает ThreadPoolExecutor, который создает, начинает и объединяет нити. Вторая строка – это понимание списка, которая создает список потоков, выполняющих get_status () Для каждого URL в списке.

Во время обработки итеративная версия GUS будет обновлять консоль с оператором печати IE: «Проверка URL 123 из 456.» Это на самом деле не имеет большого смысла в резьбовой версии Gus, так как она будет печатать «Проверка URL 456 из 456.» в доли секунды, а затем ждет get_status () функции для завершения. Я думал, что бар прогресс будет хорошим прикосновением.

Веригак/прогресс

Простота в использовании прогрессных батончиков для Python

В конце концов я использовал спиннер, который продвигает анимацию каждый раз, когда поток завершает. Я заметил, что когда-то заканчивается спиннер, он оставит себя на консольной линии, и программа будет продолжаться. Я прочитал исходный код и обнаружил, что у класса Spinner имел Writeln () который берет строку. Спасибо большое переполнение стека для ответа на вопрос: Есть ли укоренить персонаж?

Обновленная функция выглядит так:

def process_list(urlist, wanted, output):
  processed = []
  formatted = out.rtf_format if output  == 'rtf' else out.json_format if output  == 'json' else out.std_format
  spinner = Spinner('Checking URLs ')
  with concurrent.futures.ThreadPoolExecutor() as executor:
    results = [executor.submit(get_status, url) for url in urlist]
    for connection in concurrent.futures.as_completed(results):
      status = connection.result()
      if status['desc'] in wanted:
        processed.append(formatted(status))
      spinner.next()  
  spinner.writeln("\033[F")  # move cursor to the beginning of previous line
  spinner.finish()
  return processed

Остальные изменения, которые я сделал, были рефактором gus.py в меньшие связанные файлы:

gus.py создает класс Gus
const.py любые постоянные значения, необходимые для обработки
args.py обрабатывает все обшивки аргумента командной строки
urls.py Все функции проверки HTTP
out.py Функции форматирования вывода

Оригинал: “https://dev.to/slaterslater/concurrent-futures-and-showing-progress-56mc”