multithreading - studio - ¿Cuáles son las diferencias entre el sistema de servidor basado en subprocesos y basado en eventos?
thread android ejemplo (1)
Node.js es un E / S controlado por eventos y es un servidor de un solo hilo que actúa en las devoluciones de llamada y nunca se bloquea en el hilo principal.
- Pero, ¿cómo se las arregla para no bloquear la E / S?
- Si es fácil de administrar, ¿por qué no lo administra el sistema basado en subprocesos?
- ¿No funciona el resto de subprocesos (detrás de un único subproceso controlado por evento) como basado en subprocesos?
- si los otros subprocesos significan que los trabajadores (subprocesos controlados por eventos) están ocupados, ¿cómo puede manejar los trabajos sin bloquearlos?
Modelo basado en subprocesos que asigna una tarea a un subproceso y, si no hay ningún subproceso inactivo, bloquee nuevas tareas.
- Si un subproceso puede manejar múltiples tareas, como un solo subproceso controlado por eventos que maneja cada E / S sin bloquear, el sistema basado en subprocesos no usa esta táctica en subprocesos ocupados para E / S sin bloquear.
Me pregunto cuáles son las diferencias ( ventajas / desventajas ) entre los sistemas de servidor controlados por eventos y basados en subprocesos.
La diferencia se puede describir como sigue (con cierta simplificación):
en los tiempos de ejecución "controlados por subprocesos", cuando llega una solicitud, se crea un nuevo subproceso y todo el manejo se realiza en ese subproceso.
en los tiempos de ejecución "controlados por eventos", cuando se recibe una solicitud, el evento se envía y el manejador lo recogerá. ¿Cuando? En Node.js, hay un "bucle de eventos" que básicamente recorre todos los fragmentos de código que deben ejecutarse y los ejecuta uno por uno. Así que el manejador manejará el evento una vez que el bucle de evento lo invoque. Lo importante aquí es que todos los controladores se llaman en el mismo hilo: el bucle de eventos no tiene un grupo de hilos para usar, solo tiene un hilo.
En un modelo "controlado por eventos", si un manejador tardará mucho tiempo en finalizar (es decir, al tener un bucle interno computacionalmente intensivo), no se manejará ninguna otra solicitud durante ese tiempo, porque el ciclo de eventos no invocará el siguiente manejador antes de que el actual se complete. Eso generalmente no es un problema debido a la naturaleza asíncrona de Javascript.
Por otro lado, en el modelo "accionado por subprocesos", si el manejador tarda mucho tiempo en completarse, no dañará mucho a otros subprocesos, ya que pueden ejecutarse al mismo tiempo de forma independiente.
Desafortunadamente, la creación de un nuevo subproceso agrega cierta sobrecarga y, si necesita manejar miles de conexiones simultáneas, podría convertirse en una carga. Es por eso que Node.js se considera rápido: no importa cuántas conexiones maneje, solo hay un hilo 1 . Solo debes tener un poco de cuidado de no bloquear ninguno de los controladores para mantener las cosas en movimiento. Afortunadamente, la mayoría de las veces no es tan fácil escribir código JavaScript de bloqueo.
También es importante tener en cuenta que escribir código asíncrono es posible en la mayoría de los tiempos de ejecución. Sin embargo, se ha vuelto más utilizado en Node.js, debido a la naturaleza de Javascript. Gracias a eso, prácticamente todas las bibliotecas que utilice en Node serán asíncronas.
Consulte 1 para obtener una explicación del bucle de eventos.
1 Por supuesto, hay más de un hilo en el proceso de Node.js, algunos de ellos están relacionados con la E / S. Pero su lógica de aplicación se maneja en un hilo.