¿Cómo puede NodeJS ser "no bloqueante"?

14

Estoy aprendiendo NodeJS y solo quería aclarar algo. En varios tutoriales y libros introductorios hasta el momento, muy pronto describieron la arquitectura "no bloqueante" de Node, o más bien es posible (y recomendado, todo el punto) codificar de forma no bloqueante.

Por ejemplo, este ejemplo fue dado en un libro que estoy leyendo de una forma asíncrona de obtener datos de una base de datos.

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

Lo que sucede (como lo entiendo) es que Node realiza la llamada a la base de datos, luego continúa procesando lo que sea lo que sigue en la pila de llamadas. Cuando se complete la solicitud de la base de datos, la variable de datos en la función de devolución de llamada anónima se rellenará y esa función se agregará a la pila de llamadas (y luego se ejecutará cuando Node llegue a ella).

Mi pregunta es, ¿qué es exactamente procesar la solicitud de base de datos? ¿Seguramente Node tiene que bloquear mientras hace eso? ¿Qué es atender la solicitud de la base de datos? O si Node está esperando una solicitud GET de HTTP asíncrona a un recurso externo, ¿qué es lo que está atendiendo a esa solicitud que le permite a Node continuar procesando la pila de llamadas y "no bloquear"?

    
pregunta Anonymous 19.06.2013 - 11:56

1 respuesta

17

Cuando Node.js se describe como "no bloqueante", eso significa específicamente que su IO no es bloqueante. Node usa libuv para manejar su IO de una manera independiente de la plataforma. En Windows, usa los puertos de finalización de E / S, en Unix, usa epoll / kqueue / select / etc. Por lo tanto, realiza una solicitud de E / S no bloqueante (que puede tener una supervisión de subprocesos en segundo plano, pero esto nunca se expone a JavaScript) y, como resultado, lo pone en cola dentro del bucle de eventos que llama a la devolución de llamada de JavaScript en la página principal (lea: solo) hilo de JavaScript.

Para las bases de datos, depende de cómo se escribe la biblioteca. Si usa HTTP para comunicarse (como hacen algunas bases de datos NoSQL), entonces podría escribirse fácilmente en JavaScript puro usando la biblioteca estándar node http . Si lo hace de otra manera, bueno, eso depende de la biblioteca. Podría estar escrito en C / C ++ y usar subprocesos en segundo plano siempre que esa abstracción nunca esté expuesta al JavaScript.

En cuanto a su pregunta sobre qué es "procesar" la solicitud de la base de datos, idealmente, todo lo que debe hacerse es enviar un mensaje simple a una biblioteca (por ejemplo, una declaración SQL o alguna otra consulta o una solicitud de conexión), y en ese momento apuntar su JavaScript sigue chugging. Cuando la biblioteca está lista para enviar un mensaje de vuelta, envía un mensaje a la cola de eventos del nodo que ejecuta la devolución de llamada, permitiendo que se ejecute ese fragmento de código.

    
respondido por el ckknight 19.06.2013 - 12:23

Lea otras preguntas en las etiquetas