Cara ramah sumber daya untuk menunjukkan program pengguna tidak menggantung

10

Saya memiliki skrip Perl pada sistem * nix yang, pada satu titik, sedang memproses 50.000 baris teks. Ini membutuhkan waktu. Saya mencoba menemukan cara yang ramah sumber daya untuk memberi tahu pengguna bahwa programnya tidak hang ketika sedang memproses semua teks ini.

Saat ini saya mencetak hasil secara realtime karena teks sedang diproses. Saya menyiram buffer output kemudian mencetak output pada satu baris dengan \r. Ini tampaknya merupakan penggunaan sumber daya yang tidak perlu karena butuh waktu hampir dua kali lebih lama daripada ketika saya tidak mencetak apa-apa, tetapi seperti yang telah saya katakan, ketika mencetak tidak ada yang terlihat seperti program sedang menggantung.

Jadi pertanyaan saya: Apakah ada cara standar atau sederhana untuk memberi tahu pengguna bahwa program tersebut benar-benar berjalan sambil melakukan tugas yang berjalan lama?

BryanK
sumber
Unix yang mana? Jika itu FreeBSD maka Anda dapat memeriksa apakah masih sibuk dengan mengirim Control-T (Yang merupakan perintah Status default ).
Hennes

Jawaban:

6

[Saya baru sadar skrip Anda perl , tetapi logika yang sama berlaku print "\r",, dll. Anda akan ingin menggunakan STDERRatau mematikan buffering $| = 1,. Lihat bagian bawah.]

Salah satu cara menerapkan CLI "indikator kemajuan" melibatkan penggunaan karakter \r(carriage return). Ini membawa kursor ke awal baris saat ini:

#!/bin/bash

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

Jika tidak masuk akal, coba saja.

Anda dapat menggunakan teknik itu untuk menunjukkan berapa banyak garis, atau ribuan garis, telah diproses sejauh ini. Puluhan atau ratusan baris mungkin bagus karena tidak terlalu sering (lebih banyak pembaruan == runtime lebih lambat) tetapi mungkin masih cukup sering untuk menunjukkan kemajuan terus berlanjut. Anda dapat menentukan unit atau hanya menambahkan nol.

Perhatikan penggunaan -ndan -edengan echo, itu penting.

Anda juga dapat menggunakan \b(backspace) untuk efek yang sama.


Dalam 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++;
}               
goldilocks
sumber
3

Cetak satu .tanpa menggema baris baru saat Anda memproses. Teknik tua usia.

Jadi, Anda mendapatkan:

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

Sederhana dan efektif.

kurtm
sumber