He estado aprendiendo y usando Node.js durante dos meses. He usado Express y combinado con Mongoose para escribir una aplicación web y un conjunto de API web RESTful. Mirando hacia atrás en la introducción de Node.js en la página de inicio del sitio web oficial de Node.js: Node.js utiliza un modelo de E/S no bloqueado por eventos que lo hace ligero y eficiente. Entonces, ¿qué significa el modelo de E/S sin bloqueo?
Modelo IO sin bloqueo
En primer lugar, las operaciones de IO, sin duda, requieren mucho tiempo. Cuando el servidor recibe una gran cantidad de solicitudes, crear un proceso o hilo para cada solicitud también agrega sobrecarga de memoria adicional y puede perder más tiempo y recursos.
Dado que Node.js está basado en eventos, utiliza bucles de eventos para resolver los problemas de cuello de botella causados por las operaciones de IO. En Node.js, una operación IO generalmente tiene una función de devolución de llamada. Cuando la operación IO se completa y regresa, se llamará a la función de devolución de llamada y el hilo principal continúa ejecutando el siguiente código. Vamos a ilustrar brevemente este problema con un ejemplo:
request ('http://www.google.com', function (error, respuesta, cuerpo) {console.log (cuerpo);}); console.log ('¡Hecho!');Este código significa emitir una solicitud a 'http://www.google.com', y cuando la solicitud devuelve esta función de devolución de llamada, se emite la información de respuesta. Debido al mecanismo de ejecución de Node.js, después de que se ejecute este código, inmediatamente saldrá '¡Hecho!' en la consola y luego genere la información de respuesta después de un período de tiempo.
Bucle de eventos bucle de eventos
A continuación, discutamos el mecanismo del bucle de eventos. Primero, hablemos de la llamada, por ejemplo, existe el siguiente código:
función a (arg, func) {var a = arg; func (); console.log ('a'); } función b () {console.log ('b');} a (0, b);Después de ejecutar el código, la función A se empuja primero a la llamada y se convierte en el elemento superior de la pila y comienza a ejecutar A. Durante el proceso de ejecución, la función B se empuja en la llamada y se convierte en el elemento superior de la pila. Después de que se ejecuta B, B aparece y se llama, y A se convierte en el elemento superior de la pila nuevamente. Después de que se ejecuta A, A aparece y se llama, y la llamada está inactiva.
Hay una cola de mensajes en el tiempo de ejecución de JavaScript, y el mensaje está asociado con una función de devolución de llamada. Cuando se activa un evento, si el evento tiene una función de devolución de llamada correspondiente, el mensaje se agregará a la cola de mensajes.
Hablemos de cuál es el bucle del evento. Después de que el código comienza a ejecutarse, la función se empuja constantemente a la llamada. Tome el ejemplo anterior. La solicitud se impulsa a la llamada, y esta función hará una solicitud HTTP (esta solicitud HTTP se entregará al módulo subyacente de Node.js) y el evento completado al mismo tiempo se asocia con una función de devolución de llamada. La solicitud aparece y se llama, y console.log se empuja a la llamada para iniciar la ejecución. Cuando se completa la solicitud, se activa el evento de finalización y se agrega un mensaje a la cola de mensajes. La cola de mensajes primero verifica si la llamada está inactiva. Si la llamada no está inactiva, esperará hasta que la llamada esté inactiva y aparezca la cabeza de la cola de mensajes. En este momento, se ejecuta la función de devolución de llamada asociada con el mensaje.
resumen
Lo anterior es un resumen conceptual del modelo sin bloqueo y el bucle de eventos. El mecanismo de este bucle de eventos no solo es exclusivo de Node.js, y el código de Node.js se ejecuta mediante un solo hilo. ¿Cuáles son las ventajas al enfrentar una gran cantidad de solicitudes concurrentes?
La imagen de arriba muestra el diagrama de arquitectura de Node.js. Hay un módulo en la capa subyacente de Node.js es responsable de mantener el grupo de subprocesos. Cuando se emite una solicitud IO, la capa subyacente de Node.js creará un nuevo hilo para procesar la solicitud y luego devolver el resultado a la capa superior después de la finalización. Luego, cuando hay múltiples solicitudes, el módulo subyacente de Node.js usará la menor cantidad de hilos posible para completar la mayoría de las tareas. Si hay hilos gratuitos, continuará utilizándose para hacer otras cosas. Sin duda, esto es mucho más inteligente y más eficiente para la apertura de un nuevo proceso o hilo para cada solicitud como se mencionó anteriormente.
Este artículo es un resumen de Learning Node.js. Si hay algún problema o deficiencias, las críticas y la corrección son bienvenidos.