Qué es E/S no bloqueante o asincrónica en el nodo.js?


En el contexto de los motores Javascript del lado del servidor, ¿qué es E/S sin bloqueo o E/S asíncrona? Veo que esto se menciona como una ventaja sobre las implementaciones del lado del servidor Java.

Author: kapa, 2012-05-13

2 answers

Síncrono vs Asíncrono

La ejecución síncrona generalmente se refiere a la ejecución de código en secuencia. La ejecución asíncrona se refiere a la ejecución que no se ejecuta en la secuencia que aparece en el código. En el ejemplo siguiente, la operación síncrona hace que las alertas se activen en secuencia. En la operación asincrónica, mientras alert(2) parece ejecutarse en segundo lugar, no lo hace.

Síncrono: 1,2,3

alert(1);
alert(2);
alert(3);

Asíncrono: 1,3,2

alert(1);
setTimeout(() => alert(2), 0);
alert(3);

Bloqueo vs No bloqueo

El bloqueo se refiere a las operaciones que bloquean la ejecución posterior hasta que esa operación finalice. No bloqueo se refiere al código que no bloquea la ejecución. En el ejemplo dado, localStorage es una operación de bloqueo ya que detiene la ejecución para leer. Por otro lado, fetch es una operación sin bloqueo, ya que no detiene alert(3) de la ejecución.

// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);

// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);

Ventajas

Una ventaja de no bloquear, las operaciones asíncronas son que puede maximizar el uso de una sola CPU, así como la memoria.

Ejemplo de bloqueo síncrono

Un ejemplo de operaciones síncronas de bloqueo es cómo algunos servidores web como los de Java o PHP manejan solicitudes de E / s o de red. Si su código lee de un archivo o de la base de datos, su código "bloquea" todo lo que sigue de la ejecución. En ese período, su máquina está reteniendo la memoria y el tiempo de procesamiento para un hilo que no está funcionando cualquier cosa .

Para atender otras solicitudes mientras que ese hilo se ha estancado depende de su software. Lo que hace la mayoría del software de servidor es generar más hilos para atender las solicitudes adicionales. Esto requiere más memoria consumida y más procesamiento.

Ejemplo asíncrono, sin bloqueo

Los servidores asíncronos y sin bloqueo, como los que se hacen en el nodo, solo usan un subproceso para atender todas las solicitudes. Esto significa que una instancia de Nodo aprovecha al máximo un solo hilo. Los creadores lo diseñaron con la premisa de que las operaciones de E/S y de red son el cuello de botella.

Cuando las solicitudes llegan al servidor, son atendidas de una en una. Sin embargo, cuando el código mantenido necesita consultar la BD, por ejemplo, envía la devolución de llamada a una segunda cola y el subproceso principal continuará ejecutándose (no espera). Ahora, cuando la operación de la base de datos se completa y regresa, la devolución de llamada correspondiente se retira de la segunda cola y se pone en una tercera cola donde están pendientes de ejecución. Cuando el motor tiene la oportunidad de ejecutar algo más (como cuando la pila de ejecución se vacía), toma una devolución de llamada de la tercera cola y la ejecuta.

 256
Author: Joseph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-21 07:05:24
var startTime = new Date().getTime();
var getEndTime = () => {
    var tempEndTime = new Date().getTime();
    var second = (tempEndTime - startTime)/1000
    return `took ${second} sec...to finish\n`
}

console.log('1: start App', getEndTime())
setTimeout(()=>{
    console.log('2: setTimeout', getEndTime())
}, 1000)
console.log('3: End App', getEndTime())

// console -> Process Order:  1 -> 3 -> 2

Ejemplo de código

 4
Author: Wayne Chiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-31 16:14:52