javascript - nodejs - ¿La programación asíncrona significa multihilo?
programacion node js (4)
setInterval
hablar sobre el código de JavaScript que ha setInterval
métodos de setInterval
cada 2
segundos.
También tengo un evento de animación onblur
para cierto control.
En un caso donde ocurre onblur
(+ animación), podría obtener la función setInterval
.
Entonces mi pregunta es:
¿La programación Async significa multi-threading? (¿de cualquier manera?)
Sé que Javascript no es un lenguaje multihilo.
Asi que...?
No. Significa literalmente lo que significa-- asincrónico. Comprender la diferencia entre la programación asincrónica y la programación basada en hilos es fundamental para su éxito como programador.
En un entorno tradicional sin subprocesos, cuando una función debe esperar en un evento externo (como un evento de red, un evento de teclado o mouse o incluso un evento de reloj), el programa debe esperar hasta que ocurra ese evento.
En un entorno de subprocesos múltiples, muchos subprocesos individuales de programación se ejecutan al mismo tiempo. (Dependiendo de la cantidad de CPU y del soporte del sistema operativo, esto puede ser literalmente cierto, o puede ser una ilusión creada por sofisticados algoritmos de programación). Por esta razón, los entornos de subprocesos múltiples son difíciles e involucran problemas de hilos que bloquean la memoria de los demás para evitar que se sobrepasen entre sí.
En un entorno asíncrono, un hilo de proceso único se ejecuta todo el tiempo, pero puede, por razones de eventos (y esa es la clave), cambiar de una función a otra. Cuando ocurre un evento, y cuando el proceso actualmente en ejecución llega a un punto en el que debe esperar otro evento , el núcleo de javascript escanea su lista de eventos y entrega el siguiente, en un orden (formalmente) indeterminado (pero probablemente determinista) , al gerente de eventos.
Por esta razón, la programación asíncrona controlada por eventos evita muchas de las trampas de la programación tradicional con múltiples subprocesos, como los problemas de contención de la memoria. Todavía puede haber condiciones de carrera, ya que el orden en que se manejan los eventos no depende de usted, pero son raros y más fáciles de administrar. Por otro lado, dado que el controlador de eventos no entrega eventos hasta que la función que se está ejecutando actualmente llegue a un punto inactivo, algunas funciones pueden privar al resto de la programación. Esto sucede en Node.js, por ejemplo, cuando las personas tontamente hacen un montón de cálculos pesados en el servidor, lo mejor es meterlo en un pequeño servidor que luego el nodo "espera" para entregar la respuesta. Node.js es una gran pequeña centralita para eventos, pero cualquier cosa que tome más de 100 milisegundos debe manejarse de forma cliente / servidor.
En el entorno del navegador, los eventos DOM se tratan como puntos de eventos automáticos (tienen que serlo, la modificación del DOM entrega muchos eventos), pero incluso el Javascript mal escrito puede privar al núcleo, por lo que Firefox y Chrome tienen estos "Este script ha dejado de responder" los controladores de interrupción.
Si hay una devolución de llamada, algo tiene que llamarlo. Las unidades de ejecución son hilos y, sí, algún otro hilo tiene que llamar a la devolución de llamada, ya sea directamente o mediante la cola de alguna llamada de procedimiento asincrónico a la secuencia de inicio.
Solo en el sentido de que ejecuta código al azar y corre el riesgo de condiciones de carrera. No obtendrá ningún beneficio de rendimiento al usar tiempos de espera e intervalos.
Sin embargo, los WebWorkers de HTML5 permiten realizar subprocesos reales en el navegador: http://www.html5rocks.com/en/tutorials/workers/basics/
Un solo bucle de eventos con hebras es un buen ejemplo de ser asincrónico en un único lenguaje de hebras.
El concepto aquí es que adjuntas doLater
devolución de llamada doLater
al eventLoop
. Entonces eventLoop
es solo un while(true)
que verifica si la marca de tiempo específica para cada manejador doLater
se cumple, y si es así llama al manejador.
Para aquellos interesados, he aquí una implementación ingenua (y horriblemente ineficiente) de un solo ciclo de eventos con hebras en JavaScript
Esto significa que sin ningún tipo de acceso al programador de subprocesos del sistema operativo de su único subproceso, su espera forzada a ocupado en las doLater
llamada doLater
.
Si tiene una llamada de espera, puede simplemente quedarse sleep
hasta el siguiente controlador de doLater
que es más eficiente que una espera ocupada, ya que desagrega su único subproceso y permite que el sistema operativo haga otras cosas.