Cách thân thiện với tài nguyên để chỉ ra chương trình người dùng không bị treo


10

Tôi có một tập lệnh Perl trên hệ thống * nix, tại một thời điểm, đang xử lý 50.000 + dòng văn bản. Điều này cần một chút thời gian. Tôi đang cố gắng tìm một cách thân thiện với tài nguyên để cho người dùng biết chương trình không bị treo trong khi nó đang xử lý tất cả văn bản này.

Hiện tại tôi đang in đầu ra trong thời gian thực vì văn bản đang được xử lý. Tôi đang xóa bộ đệm đầu ra sau đó in đầu ra trên một dòng với \r. Đây dường như là việc sử dụng tài nguyên không cần thiết vì nó mất thời gian gần gấp đôi so với khi tôi không in gì, nhưng như tôi đã nói, khi in không có gì có vẻ như chương trình đang bị treo.

Vì vậy, câu hỏi của tôi: Có một cách tiêu chuẩn hoặc đơn giản để cho người dùng biết chương trình thực sự đang chạy trong khi thực hiện các tác vụ chạy dài?


Mà unix? Nếu đó là FreeBSD thì bạn có thể kiểm tra xem nó có còn bận hay không bằng cách gửi Control-T (Đây là lệnh Status mặc định ).
Hennes

Câu trả lời:


6

[Tôi chỉ nhận ra tập lệnh của bạn là perl , nhưng áp dụng logic tương tự print "\r", v.v. Bạn sẽ muốn sử dụng STDERRnếu không sẽ tắt bộ đệm , $| = 1. Xem phía dưới.]

Một cách để thực hiện "chỉ báo tiến độ" CLI liên quan đến việc sử dụng \rký tự (trở về vận chuyển). Điều này đưa con trỏ đến đầu dòng hiện tại:

#!/bin/bash

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

Nếu nó không có ý nghĩa, chỉ cần thử nó.

Bạn có thể sử dụng kỹ thuật đó để chỉ ra có bao nhiêu dòng hoặc hàng nghìn dòng đã được xử lý cho đến nay. Hàng chục hoặc hàng trăm dòng có thể tốt vì nó không quá thường xuyên (cập nhật nhiều hơn == thời gian chạy chậm hơn) nhưng có lẽ vẫn thường đủ để cho thấy tiến trình đang tiếp tục. Bạn có thể chỉ định một đơn vị hoặc chỉ nối các số không.

Lưu ý việc sử dụng -n-evới echo, đó là quan trọng.

Bạn cũng có thể sử dụng \b(backspace) để có hiệu lực tương tự.


Trong 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

In ra một bản duy nhất .mà không lặp lại một dòng mới khi bạn xử lý. Tuổi già kỹ thuật.

Vì vậy, bạn nhận được:

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

Đơn giản và hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.