Cập nhật: Bắt đầu với Node 0.6 bài đăng này đã lỗi thời, vì stdout hiện đang đồng bộ .
Hãy xem những gì console.log
thực sự làm.
Trước hết, nó là một phần của mô-đun bảng điều khiển :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
Vì vậy, nó chỉ đơn giản là thực hiện một số định dạng và ghi vào process.stdout
, không có gì bất đồng bộ cho đến nay.
process.stdout
là một getter được định nghĩa khi khởi động được khởi động một cách lười biếng, tôi đã thêm một số nhận xét để giải thích mọi thứ:
.... 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;
});
Trong trường hợp TTY và UNIX, chúng ta kết thúc ở đây , thứ này kế thừa từ socket. Vì vậy, tất cả những gì mà nút cơ bản làm là đẩy dữ liệu vào socket, sau đó thiết bị đầu cuối sẽ lo phần còn lại.
Hãy thử nghiệm nó!
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);
Kết quả
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
Thiết bị đầu cuối cần khoảng 1 giây để in ra nội dung ổ cắm, nhưng nút chỉ cần 17 mili giây để đẩy dữ liệu đến thiết bị đầu cuối.
Tương tự đối với trường hợp luồng và trường hợp tệp cũng được xử lý không đồng bộ .
Vì vậy, có Node.js đúng với lời hứa không chặn của nó.