node loop for example event await avoid async javascript node.js asynchronous synchronous

javascript - loop - Cuál es la diferencia entre la programación síncrona y asincrónica(en node.js)



node js avoid blocking (8)

En el caso síncrono, el comando console.log no se ejecuta hasta que la consulta SQL haya terminado de ejecutarse.

En el caso asincrónico, el comando console.log se ejecutará directamente. El resultado de la consulta será almacenado por la función de "devolución de llamada" en algún momento posterior.

He estado leyendo nodebeginner Y encontré los siguientes dos códigos.

El primero:

var result = database.query("SELECT * FROM hugetable"); console.log("Hello World");

El segundo:

database.query("SELECT * FROM hugetable", function(rows) { var result = rows; }); console.log("Hello World");

Obtengo lo que se supone que deben hacer, consultan la base de datos para recuperar la respuesta a la consulta. Y luego console.log(''Hello world'') .

El primero es un código supuestamente sincrónico. Y el segundo es un código asíncrono.

La diferencia entre las dos piezas es muy vaga para mí. ¿Cuál sería la salida?

Buscar en Google en la programación asíncrona tampoco me ayudó.


Esto sería un poco más claro si agrega una línea a ambos ejemplos:

var result = database.query("SELECT * FROM hugetable"); console.log(result.length); console.log("Hello World");

El segundo:

database.query("SELECT * FROM hugetable", function(rows) { var result = rows; console.log(result.length); }); console.log("Hello World");

Intente ejecutar estos, y notará que el primer ejemplo (sincrónico), el result.length se imprimirá ANTES de la línea ''Hello World''. En el segundo ejemplo (el asincrónico), el resultado.tiempo (lo más probable) se imprimirá DESPUÉS de la línea "Hola mundo".

Esto se debe a que en el segundo ejemplo, database.query se ejecuta de forma asincrónica en segundo plano, y el script continúa inmediatamente con el "Hola mundo". console.log(result.length) solo se ejecuta cuando se completa la consulta de la base de datos.


La diferencia entre estos dos enfoques es la siguiente:

Modo síncrono: espera a que se complete cada operación, después de eso solo ejecuta la siguiente operación. Para su consulta: El comando console.log() no se ejecutará hasta que la consulta haya terminado de ejecutarse y obtenga todos los resultados de la base de datos.

Modo asíncrono: nunca espera a que se complete cada operación, sino que ejecuta todas las operaciones solo en el primer GO. El resultado de cada operación se manejará una vez que el resultado esté disponible. Para su consulta: el comando console.log() se ejecutará poco después del método Database.Query() . Mientras que la consulta de la base de datos se ejecuta en segundo plano y carga el resultado una vez que termina de recuperar los datos.

Casos de uso

  1. Si las operaciones no son muy pesadas, como consultar grandes cantidades de datos de la base de datos, continúe con la forma síncrona de lo contrario de manera asíncrona.

  2. De manera asincrónica, puede mostrar algún indicador de progreso al usuario mientras que en segundo plano puede continuar con sus trabajos de gran peso. Este es un escenario ideal para aplicaciones GUI.


La diferencia es que en el primer ejemplo , el programa se bloqueará en la primera línea. La siguiente línea ( console.log ) tendrá que esperar.

En el segundo ejemplo , console.log se ejecutará MIENTRAS la consulta se está procesando. Es decir, la consulta se procesará en segundo plano, mientras su programa está haciendo otras cosas, y una vez que los datos de la consulta estén listos, hará lo que quiera con ellos.

Entonces, en pocas palabras: el primer ejemplo se bloqueará, mientras que el segundo no.

El resultado de los siguientes dos ejemplos:

// Example 1 - Synchronous (blocks) var result = database.query("SELECT * FROM hugetable"); console.log("Query finished"); console.log("Next line"); // Example 2 - Asynchronous (doesn''t block) database.query("SELECT * FROM hugetable", function(result) { console.log("Query finished"); }); console.log("Next line");

Sería:

  1. Query finished
    Next line
  2. Next line
    Query finished

Nota
Mientras que el nodo en sí mismo tiene un único hilo , hay algunas tareas que pueden ejecutarse en paralelo. Por ejemplo, las operaciones del sistema de archivos ocurren en un proceso diferente.

Es por eso que Node puede hacer operaciones asincrónicas: un hilo está haciendo operaciones del sistema de archivos, mientras que el hilo del nodo principal sigue ejecutando su código javascript. En un servidor controlado por eventos como Node, el subproceso del sistema de archivos notifica al subproceso Nodo principal de ciertos eventos como finalización, falla o progreso, junto con cualquier dato asociado con ese evento (como el resultado de una consulta de base de datos o un error mensaje) y el hilo del Nodo principal decide qué hacer con esos datos.

Puedes leer más sobre esto aquí: Cómo funciona el modelo IO sin bloqueo de un solo hilo en Node.js


La función hace que la segunda sea asíncrona.

El primero obliga al programa a esperar que cada línea termine su ejecución antes de que el siguiente pueda continuar. El segundo permite que cada línea se ejecute unida (e independientemente) a la vez.

Los lenguajes y marcos (js, node.js) que permiten la asincrónica o la concurrencia son geniales para cosas que requieren transmisión en tiempo real (por ejemplo, chat, aplicaciones de inventario).


La principal diferencia es con la programación asincrónica, de lo contrario no detiene la ejecución. Puede continuar ejecutando otro código mientras se realiza la ''solicitud''.


Primero, me doy cuenta de que llegué tarde a responder esta pregunta.

Antes de hablar de sincrónico y asincrónico, veamos brevemente cómo se ejecutan los programas.

En el caso sincrónico , cada instrucción se completa antes de que se ejecute la siguiente instrucción. En este caso, el programa se evalúa exactamente en orden de las declaraciones.

Así es como funciona asincrónicamente en JavaScript. Hay dos partes en el motor de JavaScript, una parte que mira el código y enque operaciones y otra que procesa la cola. El procesamiento de cola ocurre en un hilo, es por eso que solo una operación puede suceder a la vez.

Cuando se ve una operación asincrónica (como la segunda consulta de la base de datos), el código se analiza y la operación se coloca en la cola, pero en este caso se registra una devolución de llamada para que se ejecute cuando finalice esta operación. La cola puede tener muchas operaciones ya. La operación al principio de la cola se procesa y elimina de la cola. Una vez que se procesa la operación para la consulta de la base de datos, la solicitud se envía a la base de datos y cuando se completa la devolución de llamada se ejecutará al finalizar. En este momento, el procesador de cola que "manejó" la operación se mueve en la siguiente operación, en este caso

console.log("Hello World");

La consulta de la base de datos todavía se está procesando, pero la operación console.log está en la parte delantera de la cola y se procesa. Al tratarse de una operación síncrona, se ejecuta de inmediato, lo que da como resultado de inmediato la salida "Hello World". Algún tiempo después, la operación de la base de datos se completa, solo entonces se llama y procesa la devolución de llamada registrada con la consulta, estableciendo el valor del resultado de la variable en filas.

Es posible que una operación asíncrona dé como resultado otra operación asíncrona, esta segunda operación se colocará en la cola y cuando llegue al frente de la cola se procesará. Llamar a la devolución de llamada registrada con una operación asíncrona es cómo el tiempo de ejecución de JavaScript devuelve el resultado de la operación cuando se realiza.

Un método simple para saber qué operación de JavaScript es asincrónica es observar si requiere una devolución de llamada: la devolución de llamada es el código que se ejecutará cuando se complete la primera operación. En los dos ejemplos de la pregunta, podemos ver que solo el segundo caso tiene una devolución de llamada, por lo que es la operación asíncrona de los dos. No siempre es el caso debido a los diferentes estilos de manejo del resultado de una operación asincrónica.

Para obtener más información, lee sobre las promesas. Las promesas son otra forma en que se puede manejar el resultado de una operación asincrónica. Lo bueno de las promesas es que el estilo de codificación se parece más al código sincrónico.

Muchas bibliotecas, como el nodo ''fs'', proporcionan estilos síncronos y asíncronos para algunas operaciones. En los casos donde la operación no tarda mucho y no se usa mucho, como en el caso de la lectura de un archivo de configuración, la operación de estilo síncrono dará como resultado un código que es más fácil de leer.


Programación sincronizada

Los lenguajes de programación como C, C #, Java son programación de sincronización, lo que escribas se ejecutará en orden de escritura.

-GET DATA FROM SQL. //Suppose fetching data take 500 msec -PERFORM SOME OTHER FUNCTION. //Performing some function other will take 100 msec, but execution of other //task start only when fetching of sql data done (i.e some other function //can execute only after first in process job finishes). -TOTAL TIME OF EXECUTION IS ALWAYS GREATER THAN (500 + 100 + processing time) msec

Async

NodeJs presenta la característica asincrónica, es de naturaleza no bloqueante, supongamos que en cualquier tarea de E / S que tome tiempo (ir a buscar, escribir, leer), nodejs no se mantendrá inactivo y esperará a que la tarea finalice, '' Comenzaré a ejecutar las próximas tareas en la cola, y cada vez que la tarea de toma de tiempo se complete, notificará el uso de la devolución de llamada. El siguiente ejemplo ayudará:

//Nodejs uses callback pattern to describe functions. //Please read callback pattern to understand this example //Suppose following function (I/O involved) took 500 msec function timeConsumingFunction(params, callback){ //GET DATA FROM SQL getDataFromSql(params, function(error, results){ if(error){ callback(error); } else{ callback(null, results); } }) } //Suppose following function is non-blocking and took 100 msec function someOtherTask(){ //some other task console.log(''Some Task 1''); console.log(''Some Task 2''); } console.log(''Execution Start''); //Start With this function timeConsumingFunction(params, function(error, results){ if(error){ console.log(''Error'') } else{ console.log(''Successfull''); } }) //As (suppose) timeConsumingFunction took 500 msec, //As NodeJs is non-blocking, rather than remain idle for 500 msec, it will start //execute following function immediately someOtherTask();

En resumen, la salida es como:

Execution Start //Roughly after 105 msec (5 msec it''ll take in processing) Some Task 1 Some Task 2 //Roughly After 510 msec Error/Successful //depends on success and failure of DB function execution

La diferencia es clara donde la sincronización definitivamente tomará más de 600 (500 + 100 + tiempo de procesamiento) mseg, mientras que la sincronización ahorra tiempo.