2012-01-24 11 views
53

Estaba revisando los detalles de node.js y llegué a saber que, es compatible con la programación asíncrona, aunque esencialmente proporciona un único modelo de subprocesos.¿Cómo funciona la programación asincrónica en un modelo de programación con un solo hilo?

¿Cómo se maneja la programación asincrónica en tales casos? ¿Es como el tiempo de ejecución en sí mismo crea y gestiona los hilos, pero el programador no puede crear hilos explícitamente? Sería genial si alguien pudiera señalarme algunos recursos para aprender sobre esto.

Respuesta

70

Dígalo conmigo ahora: programación asíncrona no significa necesariamente multi-threaded.

Javascript es un tiempo de ejecución de subproceso único: simplemente no puede crear nuevos subprocesos en JS porque el idioma/tiempo de ejecución no lo admite.

Frank lo dice correctamente (aunque obtusamente) En inglés: hay un bucle de evento principal que se maneja cuando las cosas entran en su aplicación. Por lo tanto, "gestionar esta solicitud HTTP" se agregará a la cola de eventos, y luego será manejado por el bucle de eventos cuando corresponda.

Cuando llamas a una operación asíncrona (una consulta mysql db, por ejemplo), node.js envía "hey, ejecuta esta consulta" a mysql. Dado que esta consulta llevará algún tiempo (milisegundos), node.js realiza la consulta utilizando la biblioteca asíncrona de MySQL, volviendo al bucle de evento y haciendo algo más allí mientras espera que mysql nos lo devuelva. Como manejar esa solicitud HTTP.

Editar: Por el contrario, Node.js podría simplemente esperar (no hacer nada) para MySQL para volver a ella. Esto se llama una llamada síncrona. Imagine un restaurante, donde su camarero envía su pedido al cocinero, luego se sienta y mueve los pulgares mientras el chef cocina. En un restaurante, como en un programa node.js, tal comportamiento es insensato: tiene otros clientes que tienen hambre y necesitan que se les atienda. Por lo tanto, debe ser lo más asíncrono posible para asegurarse de que un camarero (o proceso node.js) esté sirviendo a tantas personas como les sea posible.

Editar hecho

Node.js comunica con MySQL usando bibliotecas de C, por lo que técnicamente esas bibliotecas de C podría generar roscas fuera, pero por dentro Javascript no se puede hacer nada con hilos.

+9

Más exactamente. "Node.js se comunica con mysql a través de una API asíncrona. La implementación de la API asíncrona está en C y esa implementación solo puede ejecutar la API síncrona a través de un threadpool". El hecho de que la API asíncrona pueda usar un grupo de subprocesos internamente es un detalle de bajo nivel que no le importa. – Raynos

+0

Ah, entonces el mysql se ejecuta en un hilo diferente, luego agrega un evento a JS cuando termina.Si quisiera crear un módulo asíncrono, podría usar los procesos hijos en el nodo para lograr el mismo efecto. – BigOmega

+3

Creo que es mejor evitar aquí la palabra 'hilo': las personas llegan a conclusiones falsas cuando lo oyen. una llamada asincrónica puede usar un hilo, o tenedor de un proceso, o hacer lo que sea; Lo importante es que puede ocurrir una devolución de llamada o un evento más adelante en el ciclo de evento. – flow

8

Ryan dijo que es lo mejor: sincronización/asincronización es ortogonal a uno/múltiples hilos. Para casos únicos y de subprocesos múltiples, existe un bucle de evento principal que llama devoluciones de llamada registradas usando Reactor Pattern. Para el caso de un solo subproceso, las devoluciones de llamada se invocan secuencialmente en el hilo principal. Para el caso de subprocesos múltiples, se invocan en subprocesos separados (normalmente utilizando un grupo de subprocesos). Realmente es una cuestión de cuánta contención habrá: si todas las solicitudes requieren acceso sincronizado a una única estructura de datos (por ejemplo, una lista de suscriptores), entonces los beneficios de tener múltiples hilos pueden verse disminuidos. Depende del problema

En cuanto a la implementación, si una infraestructura tiene un solo subproceso, es probable que se use la llamada al sistema poll/select, es decir, el sistema operativo está activando el evento asincrónico.

Cuestiones relacionadas