У меня есть Perl-скрипт в системе * nix, который в какой-то момент обрабатывает более 50 000 строк текста. Это займет некоторое время. Я пытаюсь найти удобный для пользователей способ сообщить пользователю, что программа не зависает во время обработки всего этого текста.
В настоящее время я печатаю вывод в реальном времени, так как текст обрабатывается. Я очищаю выходной буфер, затем печатаю вывод в одну строку с помощью \r
. Это кажется ненужным использованием ресурсов, потому что это занимает почти вдвое больше времени, чем когда я ничего не печатаю, но, как я уже сказал, при печати ничего не похоже, что программа зависает.
Итак, мой вопрос: существует ли стандартный или простой способ сообщить пользователю, что программа действительно выполняется при выполнении долго выполняемых задач?
Ответы:
[Я только что понял ваш сценарий Perl , но та же логика применима,
print "\r"
и т.д. Вы хотите использоватьSTDERR
или еще очередь выключить буферизацию,$| = 1
. Смотри внизу.]Один из способов реализации CLI «индикатор прогресса» заключается в использовании
\r
символа (возврат каретки). Это приводит курсор к началу текущей строки:Если это не имеет смысла, просто попробуйте.
Вы можете использовать эту технику, чтобы указать, сколько строк или тысяч строк было обработано до сих пор. Десятки или сотни строк могут быть хорошими, поскольку это не слишком часто (больше обновлений == медленнее времени выполнения), но, вероятно, все еще достаточно часто, чтобы показать, что прогресс продолжается. Вы можете указать единицу или просто добавить нули.
Обратите внимание на использование
-n
и-e
сecho
, что важно.Вы также можете использовать
\b
(Backspace) для аналогичного эффекта.В Perl:
источник
Распечатайте сингл,
.
не повторяя при этом новую строку. Вековая техника.Итак, вы получите:
Processing...............
Просто и эффективно.
источник