Pembaruan: Dimulai dengan Node 0.6, posting ini sudah usang, karena stdout sudah sinkron sekarang.
Baiklah, mari kita lihat apa yang console.log
sebenarnya dilakukannya.
Pertama-tama itu adalah bagian dari modul konsol :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
Jadi itu hanya melakukan beberapa pemformatan dan penulisan ke process.stdout
, sejauh ini tidak ada yang asinkron.
process.stdout
adalah pengambil yang didefinisikan pada startup yang diinisialisasi dengan malas, saya telah menambahkan beberapa komentar untuk menjelaskan hal-hal:
.... 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;
});
Dalam kasus TTY dan UNIX kami berakhir di sini , hal ini mewarisi dari soket. Jadi semua yang dilakukan node itu pada dasarnya adalah mendorong data ke soket, lalu terminal akan mengurus sisanya.
Mari kita uji!
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);
Hasil
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
Terminal membutuhkan sekitar 1 detik untuk mencetak konten soket, tetapi node hanya membutuhkan 17 milidetik untuk mendorong data ke terminal.
Hal yang sama berlaku untuk kasus aliran, dan juga kasus file ditangani secara asinkron .
Jadi ya, Node.js memegang teguh janji non-pemblokirannya.
process.stdout.write()
manawrite()
menurut definisi asynchronous ...console.warn () dan console.error () memblokir. Mereka tidak kembali sampai panggilan sistem yang mendasarinya berhasil.
Ya, mungkin saja program keluar sebelum semua yang ditulis ke stdout dihapus. process.exit () akan segera menghentikan node, meskipun masih ada antrian penulisan ke stdout. Anda harus menggunakan console.warn untuk menghindari perilaku ini.
sumber
console.warn()
danconsole.error()
memiliki perilaku non-pemblokiran yang sama dariconsole.log()
. Bahkan ada paket untuk menyelesaikan masalah di Windows .Kesimpulan saya, setelah membaca Node.js 10. * docs (Terlampir di bawah). adalah bahwa Anda dapat menggunakan console.log untuk logging, console.log sinkron dan diimplementasikan di tingkat rendah c. Meskipun console.log bersifat sinkronis, itu tidak akan menyebabkan masalah kinerja hanya jika Anda tidak mencatat data dalam jumlah besar.
(Contoh baris perintah di bawah ini menunjukkan, console.log async dan console.error adalah sinkronisasi )
Berdasarkan Node.js Doc's
$ node script.js 2> error.log | tee info.log
Semoga membantu
sumber
Console.log adalah asynchronous di windows sementara itu sinkron di linux / mac. Untuk membuat console.log sinkron di windows, tulis baris ini di awal kode Anda mungkin di file index.js. Semua console.log setelah pernyataan ini akan dianggap sinkron oleh interpreter.
sumber