프로그램이 중단되지 않았음을 사용자에게 알리는 리소스 친화적인 방법

프로그램이 중단되지 않았음을 사용자에게 알리는 리소스 친화적인 방법

나는 한때 50,000줄이 넘는 텍스트를 처리하던 *nix 시스템에 Perl 스크립트를 가지고 있습니다. 시간이 좀 걸립니다. 나는 이 모든 텍스트를 처리하는 동안 프로그램이 중단되지 않는다는 것을 사용자에게 알리기 위한 자원 친화적인 방법을 찾으려고 노력하고 있습니다.

현재 텍스트를 처리하는 동안 실시간으로 출력을 인쇄하고 있습니다. 출력 버퍼를 플러시한 다음 한 줄에 출력을 인쇄합니다 \r. 아무 것도 인쇄하지 않을 때보다 거의 두 배의 시간이 걸리기 때문에 불필요한 리소스 사용처럼 보이지만, 내가 말했듯이 아무것도 인쇄되지 않으면 프로그램이 중단된 것처럼 보입니다.

그래서 내 질문은: 장기 실행 작업을 수행할 때 프로그램이 실제로 실행되고 있음을 사용자에게 알리는 표준 또는 간단한 방법이 있습니까?

답변1

[방금 당신의 대본이진주, 그러나 동일한 논리가 적용됩니다 print "\r". STDERR버퍼링을 사용하거나 꺼야 합니다 $| = 1. 하단을 참조하세요. ]

CLI "진행 표시기"를 구현하는 한 가지 방법은 \r(캐리지 리턴) 문자를 사용하는 것입니다. 그러면 커서가 현재 줄의 시작 부분으로 이동됩니다.

#!/bin/bash

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

말이 안 된다면 시도해 보세요.

이 기술을 사용하여 지금까지 처리된 행 수 또는 수천 개의 행을 나타낼 수 있습니다. 수십 또는 수백 개의 행은 너무 빈번하지 않기 때문에 괜찮을 수 있지만(더 많은 업데이트 == 느린 런타임) 진행이 계속되고 있음을 보여줄 만큼 여전히 충분히 빈번할 수 있습니다. 단위를 지정하거나 0을 추가할 수 있습니다.

-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++;
}               

답변2

.처리하는 동안 개행 문자를 에코하지 않고 인쇄합니다. 고대 기술.

그래서 당신은 다음을 얻습니다:

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

간단하고 효과적입니다.

관련 정보