Actualización: a partir del Nodo 0.6, esta publicación es obsoleta, ya que stdout ahora es sincrónico .
Bueno, veamos lo que console.log
realmente hace.
En primer lugar, es parte del módulo de la consola :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
Así que simplemente formatea y escribe process.stdout
, nada asincrónico hasta ahora.
process.stdout
es un captador definido en el inicio que se inicializa de manera perezosa, he agregado algunos comentarios para explicar las 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 el caso de TTY y UNIX terminamos aquí , esto hereda de socket. Entonces, todo lo que hace básicamente ese nodo es enviar los datos al socket, luego el terminal se encarga del resto.
¡Probémoslo!
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 los sockets, pero el nodo solo necesita 17 milisegundos para enviar los datos al terminal.
Lo mismo ocurre con el caso de transmisión, y también el caso del archivo se maneja de forma asincrónica .
Entonces, sí, Node.js se mantiene fiel a sus promesas de no bloqueo.
process.stdout.write()
dondewrite()
es, por definición, asincrónico ...console.warn () y console.error () están bloqueando. No regresan hasta que las llamadas al sistema subyacente se hayan realizado correctamente.
Sí, es posible que un programa se cierre antes de que todo lo escrito en stdout se haya eliminado. process.exit () terminará el nodo inmediatamente, incluso si todavía hay escrituras en cola en stdout. Debe usar console.warn para evitar este comportamiento.
fuente
console.warn()
yconsole.error()
tienen el mismo comportamiento sin bloqueo deconsole.log()
. Incluso hay un paquete para resolver el problema en Windows .Mi conclusión, después de leer Node.js 10. * docs (adjunto a continuación). es que puede usar console.log para el registro, console.log es síncrono y está implementado en nivel bajo c. Aunque console.log es sincrónico, no causará un problema de rendimiento solo si no registra una gran cantidad de datos.
(El siguiente ejemplo de línea de comando demuestra, console.log async y console.error es sync )
Basado en Node.js Doc's
$ node script.js 2> error.log | tee info.log
Espero eso ayude
fuente
Console.log es asíncrono en Windows mientras que lo es en linux / mac. Para hacer que console.log sea sincrónico en Windows, escribe esta línea al comienzo de tu código, probablemente en el archivo index.js. Cualquier console.log después de esta declaración será considerado sincrónico por el intérprete.
fuente