En el contexto de los motores Javascript del lado del servidor, ¿qué son las E / S sin bloqueo o las E / S asíncronas? Veo que esto se menciona como una ventaja sobre las implementaciones del lado del servidor Java.
En el contexto de los motores Javascript del lado del servidor, ¿qué son las E / S sin bloqueo o las E / S asíncronas? Veo que esto se menciona como una ventaja sobre las implementaciones del lado del servidor Java.
Respuestas:
La ejecución síncrona generalmente se refiere a la ejecución de código en secuencia. La ejecución asincrónica se refiere a la ejecución que no se ejecuta en la secuencia que aparece en el código. En el siguiente ejemplo, la operación síncrona hace que las alertas se disparen en secuencia. En la operación asíncrona, aunque alert(2)
parece ejecutarse en segundo lugar, no lo hace.
Sincrónico: 1,2,3
alert(1);
alert(2);
alert(3);
Asincrónico: 1,3,2
alert(1);
setTimeout(() => alert(2), 0);
alert(3);
El bloqueo se refiere a operaciones que bloquean la ejecución posterior hasta que finalice esa operación. Sin 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 se detiene alert(3)
durante 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);
Una ventaja de las operaciones asincrónicas sin bloqueo es que puede maximizar el uso de una sola CPU y memoria.
Un ejemplo de operaciones de bloqueo síncrono es cómo algunos servidores web como los de Java o PHP manejan las solicitudes de IO o de red. Si su código se lee desde un archivo o la base de datos, su código "bloquea" todo después de su ejecución. En ese período, su máquina retiene la memoria y el tiempo de procesamiento de un hilo que no está haciendo nada .
Para atender otras solicitudes mientras el hilo se ha estancado depende de su software. Lo que la mayoría del software de servidor hace es generar más hilos para atender las solicitudes adicionales. Esto requiere más memoria consumida y más procesamiento.
Los servidores asíncronos que no bloquean, como los creados en Node, solo usan un hilo para atender todas las solicitudes. Esto significa que una instancia de Node aprovecha al máximo un solo hilo. Los creadores lo diseñaron con la premisa de que las operaciones de red y E / S son el cuello de botella.
Cuando las solicitudes llegan al servidor, se atienden de una en una. Sin embargo, cuando el código revisado necesita consultar la base de datos, 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 DB se completa y regresa, la devolución de llamada correspondiente se retiró de la segunda cola y se puso en cola en una tercera cola donde están pendientes de ejecución. Cuando el motor tiene la oportunidad de ejecutar otra cosa (como cuando se vacía la pila de ejecución), recoge una devolución de llamada de la tercera cola y la ejecuta.
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