Ресурс дружественный способ указать пользователю программы не висит


10

У меня есть Perl-скрипт в системе * nix, который в какой-то момент обрабатывает более 50 000 строк текста. Это займет некоторое время. Я пытаюсь найти удобный для пользователей способ сообщить пользователю, что программа не зависает во время обработки всего этого текста.

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

Итак, мой вопрос: существует ли стандартный или простой способ сообщить пользователю, что программа действительно выполняется при выполнении долго выполняемых задач?


Какой Unix? Если это FreeBSD, то вы можете проверить, все еще ли он занят, отправив Control-T (который является командой Status по умолчанию ).
Хенн

Ответы:


6

[Я только что понял ваш сценарий Perl , но та же логика применима, print "\r"и т.д. Вы хотите использовать STDERRили еще очередь выключить буферизацию, $| = 1. Смотри внизу.]

Один из способов реализации CLI «индикатор прогресса» заключается в использовании \rсимвола (возврат каретки). Это приводит курсор к началу текущей строки:

#!/bin/bash

count=0
while ((1)); do
    echo -ne "\rCount: $count"
    sleep 1;
    count=$(($count+1));
done     

Если это не имеет смысла, просто попробуйте.

Вы можете использовать эту технику, чтобы указать, сколько строк или тысяч строк было обработано до сих пор. Десятки или сотни строк могут быть хорошими, поскольку это не слишком часто (больше обновлений == медленнее времени выполнения), но, вероятно, все еще достаточно часто, чтобы показать, что прогресс продолжается. Вы можете указать единицу или просто добавить нули.

Обратите внимание на использование -nи -eс echo, что важно.

Вы также можете использовать \b(Backspace) для аналогичного эффекта.


В Perl:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

$| = 1;  # Pipeline stdout (i.e., no buffering).

my $count = 1;
while ($count) {
    print "\rCount $count";
    sleep 1;
    $count++;
}               

3

Распечатайте сингл, .не повторяя при этом новую строку. Вековая техника.

Итак, вы получите:

Processing...............

Просто и эффективно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.