क्या नोड.जेड का कंसोल है। अतुल्यकालिक?


95

क्या console.log/debug/warn/errorनोड में एसिंक्रोनस हैं? मेरा मतलब है कि जावास्क्रिप्ट कोड निष्पादन को तब तक रोक दिया जाएगा जब तक कि स्क्रीन पर सामान मुद्रित नहीं हो जाता है या बाद के चरण में प्रिंट हो जाएगा?

इसके अलावा, मुझे यह जानने में दिलचस्पी है कि क्या यह कंसोल के लिए संभव है। नोड को क्रैश करने के तुरंत बाद बयान को प्रदर्शित करने के लिए कुछ भी प्रदर्शित न करें।

जवाबों:


102

अद्यतन: नोड 0.6 के साथ शुरू यह पोस्ट अप्रचलित है, क्योंकि स्टडआउट अब तुल्यकालिक है।

खैर देखते हैं कि console.logवास्तव में क्या करता है।

सबसे पहले यह कंसोल मॉड्यूल का हिस्सा है :

exports.log = function() {
  process.stdout.write(format.apply(this, arguments) + '\n');
};

तो यह बस कुछ स्वरूपण करता है और लिखता है process.stdout, अतुल्यकालिक अब तक कुछ भी नहीं।

process.stdoutस्टार्टअप पर परिभाषित एक गेटर है जो आलसी रूप से आरंभिक है, मैंने चीजों को समझाने के लिए कुछ टिप्पणियां जोड़ी हैं:

.... code here...
process.__defineGetter__('stdout', function() {
  if (stdout) return stdout;                            // only initialize it once 

  /// many requires here ...

  if (binding.isatty(fd)) {                             // a terminal? great!
    stdout = new tty.WriteStream(fd);
  } else if (binding.isStdoutBlocking()) {              // a file?
    stdout = new fs.WriteStream(null, {fd: fd});
  } else {
    stdout = new net.Stream(fd);                        // a stream? 
                                                        // For example: node foo.js > out.txt
    stdout.readable = false;
  }

  return stdout;
});

TTY और UNIX के मामले में हम यहाँ समाप्त होते हैं , यह बात सॉकेट से विरासत में मिली है। तो वह सब जो नोड बेसिसली करता है वह डेटा को सॉकेट पर पुश करने के लिए होता है, फिर टर्मिनल बाकी की देखभाल करता है।

चलिए इसे टेस्ट करते हैं!

var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
    data += data; // warning! gets very large, very quick
}

var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);

परिणाम

....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms

real    0m0.969s
user    0m0.068s
sys  0m0.012s

टर्मिनल को सॉकेट्स सामग्री को प्रिंट करने के लिए लगभग 1 सेकंड की आवश्यकता होती है, लेकिन टर्मिनल को डेटा को पुश करने के लिए नोड को केवल 17 मिलीसेकंड की आवश्यकता होती है।

वही स्ट्रीम केस के लिए जाता है, और फाइल केस को एसिंक्रोनस हैंडल किया जाता है

तो हाँ Node.js अपने गैर-अवरुद्ध वादों के लिए सही है।


2
अपडेट: Node.js में stdout अब तुल्यकालिक है: groups.google.com/group/nodejs/browse_thread/thread/...
dhruvbird

1
मुझे लगता है कि यह अब अप्रचलित है: github.com/nodejs/node/issues/3524#issuecomment-151097761
tforgione

@IvoWetzel मैं अब इसे अपडाउन करने जा रहा हूं क्योंकि यह अप्रचलित है।
इवान कैरोल

मुझे पता है कि यह अप्रचलित है और सब कुछ है, लेकिन आप कहते हैं कि "अतुल्यकालिक कुछ भी नहीं" के तुरंत बाद process.stdout.write()जहां write()परिभाषा अतुल्यकालिक है ...
binki

26

Comfort.warn () और कंसोल .error () ब्लॉक कर रहे हैं। जब तक अंतर्निहित सिस्टम कॉल सफल नहीं हुए, वे वापस नहीं आते हैं।

हां, प्रोग्राम के लिए यह संभव है कि स्टडआउट में लिखी गई हर चीज को फ्लश कर दिया जाए। process.exit () नोड को तुरंत समाप्त कर देगा, भले ही अभी भी पंक्तिबद्ध हो stdout को लिखते हैं। इस व्यवहार से बचने के लिए आपको सांत्वना का उपयोग करना चाहिए।


1
यह विंडोज में नोड 0.10.25 के लिए सही नहीं है। console.warn()और console.error()एक ही गैर-अवरुद्ध व्यवहार है console.log()विंडोज में समस्या को हल करने के लिए एक पैकेज भी है ।
लुसियो पाइवा

12

मेरा निष्कर्ष, Node.js 10. * डॉक्स (नीचे संलग्न) पढ़ने के बाद। यह है कि आप लॉगिंग के लिए कंसोल.लॉग का उपयोग कर सकते हैं, कंसोल.लॉग समकालिक है और निम्न स्तर सी में कार्यान्वित किया जाता है। यद्यपि, कंसोल.लग समकालिक है, लेकिन यह केवल एक प्रदर्शन समस्या का कारण नहीं होगा जब आप बड़ी मात्रा में डेटा लॉग नहीं कर रहे हैं।

(कमांड लाइन उदाहरण नीचे प्रदर्शित, console.log async और console.error है सिंक )

Node.js Doc के आधार पर

कंसोल फ़ंक्शंस समकालिक होता है जब गंतव्य एक टर्मिनल या एक फ़ाइल (समय से पहले निकलने के मामले में खोए हुए संदेशों से बचने के लिए) और अतुल्यकालिक होता है जब यह एक पाइप होता है (लंबे समय तक अवरुद्ध रहने से बचने के लिए)।

अर्थात्, निम्न उदाहरण में, stdout गैर-अवरुद्ध है जबकि stderr अवरुद्ध है:

$ node script.js 2> error.log | tee info.log

दैनिक उपयोग में, अवरुद्ध / गैर-अवरुद्ध डाइकोटॉमी कुछ ऐसी चीज नहीं है जिसके बारे में आपको तब तक चिंता करनी चाहिए जब तक कि आप भारी मात्रा में डेटा लॉग न करें।

आशा करता हूँ की ये काम करेगा


"भारी मात्रा में डेटा" क्या है? क्या इसे कंसोल की संख्या द्वारा परिभाषित किया गया है। कंसोल या कुल राशि लिखी जा रही है? 1KB / ms, 1MB / ms, 1GB / ms कितना बड़ा है?
मैट जीएपी

3

Console.log विंडोज़ में एसिंक्रोनस है, जबकि यह लिनक्स / मैक में सिंक्रोनस है। विंडोज़ में कंसोल.लॉग सिंक्रोनस बनाने के लिए अपने कोड के शुरू में इस लाइन को इंडेक्स में लिखें। शायद फाइल। इस कथन के बाद किसी भी सांत्वना.लोक को दुभाषिया द्वारा समकालिक माना जाएगा।

if (process.stdout._handle) process.stdout._handle.setBlocking(true);

लिनक्स वैसे भी सिर्फ ubuntu नहीं है।
ozanmuyes

धन्यवाद, मेरी पंडिताऊ टिप्पणी बहाना लेकिन डेबियन मेरी कमजोर है और यह हर कोई है जो लिनक्स का उपयोग करने के लिए शुरू कर दिया आजकल सोचता है कि उबंटू लगता है लिनक्स (आप को छोड़कर, मुझे पता है कि आप उनमें से एक नहीं हैं)। आपका दिन शुभ हो :)
ozanmuyes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.