Güncelleme: Düğüm 0.6'dan başlayarak, stdout şu anda eşzamanlı olduğundan bu gönderi geçersizdir .
Peki console.log
aslında ne yaptığını görelim .
Her şeyden önce konsol modülünün bir parçası :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
Bu yüzden sadece biraz biçimlendirme yapıyor ve yazıyor process.stdout
, şimdiye kadar hiçbir şey eşzamansız değil.
process.stdout
Bir alıcı olduğu başlangıçta tanımlanan lazily başlatılır, ben şeyleri açıklamaya bazı yorumlar ekledik:
.... code here...
process.__defineGetter__('stdout', function() {
if (stdout) return stdout;
if (binding.isatty(fd)) {
stdout = new tty.WriteStream(fd);
} else if (binding.isStdoutBlocking()) {
stdout = new fs.WriteStream(null, {fd: fd});
} else {
stdout = new net.Stream(fd);
stdout.readable = false;
}
return stdout;
});
Bir TTY ve UNIX durumunda, burada son buluruz , bu şey soketten miras alınır. Yani bu düğümün temelde yaptığı tek şey, veriyi sokete itmektir, ardından terminal gerisini halleder.
Hadi deneyelim!
var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
data += data;
}
var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);
Sonuç
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
Terminalin soket içeriğini yazdırması yaklaşık 1 saniyeye ihtiyaç duyar, ancak düğümün verileri terminale göndermek için yalnızca 17 milisaniyeye ihtiyacı vardır.
Aynı durum akış durumu için de geçerlidir ve dosya durumu da eşzamansız olarak ele alınır .
Yani evet, Node.js engellemeyen vaatlerine sadık kalıyor.