Я сделал несколько обновлений Густаво: один майор; один несовершеннолетний; и некоторые рефакторинг.
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”