Actualización: A partir de Nodo 0,6 este post es obsoleta, ya que la salida estándar es sincrónica ahora.
Bien, veamos qué hace realmente console.log
.
En primer lugar es parte de la console module:
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
Por lo tanto, simplemente hace algún formato y escribe en process.stdout
, nada asíncrono hasta ahora.
process.stdout
es un captador defined on startup que se inicializa con pereza, he añadido algunos comentarios para explicar cosas:
.... 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;
});
En caso de un TTY y UNIX terminamos here, esta cosa hereda de zócalo. Entonces, todo lo que el nodo básicamente hace es enviar los datos al socket, luego el terminal se ocupa del resto.
¡Pruébelo!
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);
Resultado
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
El terminal necesita alrededor de 1 segundo para imprimir el contenido de tomas de corriente, pero nodo sólo tiene 17 milisegundos para empujar los datos a la terminal.
Lo mismo ocurre con la caja de flujo, y también el caso de archivo se maneja asynchronous.
So sí Node.js se mantiene fiel a sus promesas de no bloqueo.
Actualización: la salida estándar en Node.js es ahora sincrónica: http://groups.google.com/group/nodejs/browse_thread/thread/8c85c2dae1a1f585 – dhruvbird
creo que esto es obsoleto en la actualidad: https://github.com/nodejs/node/issues/3524#issuecomment-151097761 – tforgione
@ IvoWetzel Voy a tener que rechazar esto ahora, ya que es obsoleto. –