उपयोगकर्ता के कार्यक्रम को इंगित करने के लिए संसाधन अनुकूल तरीका लटका नहीं है


10

मेरे पास एक * nix सिस्टम पर एक पर्ल स्क्रिप्ट है जो एक बिंदु पर, टेक्स्ट की 50,000 + लाइनों को प्रोसेस कर रही है। इसमें कुछ समय लगता है। मैं एक संसाधन अनुकूल तरीका खोजने की कोशिश कर रहा हूं ताकि उपयोगकर्ता यह जान सके कि इस पाठ को संसाधित करते समय प्रोग्राम लटका हुआ नहीं है।

वर्तमान में मैं वास्तविक समय में आउटपुट प्रिंट कर रहा हूं क्योंकि पाठ संसाधित किया जा रहा है। मैं आउटपुट बफर को फ्लश कर रहा हूं और आउटपुट को एक लाइन पर प्रिंट करता हूं \r। यह संसाधनों का अनावश्यक उपयोग प्रतीत होता है क्योंकि जब तक मैं कुछ भी नहीं छापता हूं, तब तक लगभग दोगुना समय लगता है, लेकिन जैसा कि मैंने कहा है, जब कुछ भी नहीं छापता है तो ऐसा लगता है कि कार्यक्रम लटका हुआ है।

तो मेरा प्रश्न: क्या उपयोगकर्ता को यह पता करने के लिए एक मानक या सरल तरीका है कि प्रोग्राम वास्तव में लंबे समय तक चलने वाले कार्यों को करते हुए चल रहा है?


कौन सा यूनिक्स? यदि यह FreeBSD है तो आप यह देख सकते हैं कि क्या यह अभी भी Control-T (जो कि डिफ़ॉल्ट स्थिति कमांड है) भेजकर व्यस्त है ।
हेन्नेस

जवाबों:


6

[मैं सिर्फ महसूस किया अपनी स्क्रिप्ट है पर्ल , लेकिन एक ही तर्क लागू होता है print "\r", आदि आप उपयोग करना चाहते हैं जाएगा STDERRवरना बफरिंग बंद कर देते हैं $| = 1। नीचे देखें।]

सीएलआई "प्रगति संकेतक" को लागू करने के एक तरीके में \r(गाड़ी वापसी) चरित्र का उपयोग शामिल है । यह कर्सर को वर्तमान लाइन की शुरुआत में लाता है:

#!/bin/bash

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

अगर यह समझ में नहीं आता है, तो बस कोशिश करो।

आप उस तकनीक का उपयोग करके यह बता सकते हैं कि अब तक कितनी लाइनों या हजारों लाइनों को संसाधित किया गया है। दसियों या सैकड़ों लाइनें अच्छी हो सकती हैं क्योंकि यह बहुत बार नहीं होती है (अधिक अपडेट == धीमी रनटाइम) लेकिन शायद अभी भी अक्सर प्रगति दिखाने के लिए पर्याप्त है। आप एक इकाई निर्दिष्ट कर सकते हैं या सिर्फ शून्य जोड़ सकते हैं।

के साथ -nऔर उसके उपयोग पर ध्यान दें , यह महत्वपूर्ण है। -eecho

आप \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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.