Зручний для ресурсів спосіб вказати на програму користувача не висить


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(назад) для подібного ефекту.


У перл:

#!/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.