valid promises only nodejs node log example ejemplos commands await async asynchronous console node.js

asynchronous - promises - node js console commands



es node.js ''console.log asincrónico? (4)

Console.log es asíncrono en Windows mientras es sincrónico en ubuntu / mac. Para hacer que console.log sea sincrónico en Windows, escriba esta línea al comienzo de su código probablemente en el archivo index.js. Cualquier consola.log después de esta declaración se considerará sincrónica por el intérprete.

if (process.stdout._handle) process.stdout._handle.setBlocking(true);

¿Están console.log/debug/warn/error en node.js asynchrounous? Quiero decir que la ejecución del código JavaScript se detendrá hasta que se imprima en la pantalla o se imprimirá en una etapa posterior.

Además, estoy interesado en saber si es posible que un console.log NO muestre nada si la instrucción inmediatamente después de bloquear el nodo.


Mi conclusión, después de leer Node.js 10. * documentos (Adjunto a continuación). es que puede usar console.log para el registro, console.log es sincrónico e implementado en bajo nivel c. Aunque console.log es sincrónico, no causará un problema de rendimiento solo si no está registrando una gran cantidad de datos.

(El siguiente ejemplo de línea de comandos demuestra, console.log async y console.error es sincronización )

Basado en el documento de Node.js

Las funciones de la consola son síncronas cuando el destino es un terminal o un archivo (para evitar mensajes perdidos en caso de salida prematura) y asíncrono cuando es un conducto (para evitar el bloqueo durante largos períodos de tiempo).

Es decir, en el siguiente ejemplo, stdout no bloquea mientras stderr está bloqueando:

$ node script.js 2> error.log | tee info.log

En el uso diario, la dicotomía bloqueo / no bloqueo no es algo de lo que deba preocuparse a menos que> registre grandes cantidades de datos.

Espero eso ayude


console.warn () y console.error () están bloqueando. No vuelven hasta que las llamadas al sistema subyacentes hayan tenido éxito.

Sí, es posible que un programa salga antes de que todo lo escrito en stdout haya sido eliminado. process.exit () terminará el nodo inmediatamente, incluso si aún hay escrituras en cola para stdout. Debería usar console.warn para evitar este comportamiento.


Actualización: comenzando con el nodo 0.6, esta publicación está obsoleta, ya que stdout ahora es síncrona .

Bien, veamos qué hace console.log realidad.

En primer lugar, es parte del módulo de la consola :

exports.log = function() { process.stdout.write(format.apply(this, arguments) + ''/n''); };

Por lo tanto, simplemente formatea y escribe para process.stdout . Sin embargo, nada asíncrono hasta el momento.

process.stdout es un getter definido en el inicio que se inicializa de forma 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 un TTY y UNIX que terminamos here , esto hereda del socket. Entonces, todo lo que el nodo básicamente hace es enviar los datos al socket, luego el terminal se ocupa 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 de archivo obtiene asynchronous .

Entonces, sí, Node.js se mantiene fiel a sus promesas de no bloqueo.