¿Qué tiene de especial el nodo.js "sin bloqueo"?

7

En el breve capítulo, What is Node por McLaughlin , escribe:

  

"El nodo no tiene bloques, no hay subprocesos compitiendo por el mismo recurso (Nodo   está feliz de dejar que las cosas sucedan como suceden), nada que   Tiene que arrancar previa solicitud. Nodo simplemente se sienta a la espera (bastante   literalmente; los que no usan el Node están durmiendo). Cuando llega una solicitud   en, se maneja. Esto da como resultado un código muy rápido, sin uber-   programadores que escriben el comportamiento del lado del servidor ".

Aunque creo que está seleccionando PHP aquí, por lo que entiendo, no hay una manera para que PHP no recupere nuevas referencias a sus bases de datos, archivos, etc., siempre que cualquier página de php sea cargado: ¿es esto realmente diferente a otras tecnologías web? Considere Django / Flask por ejemplo o un simple Python threaded-server usando métodos incorporados - es ¿Es realmente diferente a las ventajas de Node de los bloques? Ejecuta un programa y se une a un socket, ejecutando la función solo cuando es necesario. (¿Java no hace esto también?)

    
pregunta NoBugs 28.06.2015 - 07:35

3 respuestas

9

Deje de inmediato el descargo de responsabilidad de Turing y digamos que cualquier idioma probablemente se pueda aproximar a cualquier característica de tiempo de ejecución de cualquier otro idioma. ¿Bueno? Bien.

La principal diferencia entre el enfoque de Node.js y un servidor de subprocesos de Python (o una implementación típica de un servidor HTTP de Java) es que Node.js es de un solo subproceso, mientras que los dos últimos son multiproceso. Más específicamente, los dos últimos típicamente dedicarán un hilo por solicitud. Si, en el manejo de esa solicitud, necesita hacer algo lento, como leer desde el disco duro o conectarse a una base de datos remota, el subproceso permanecerá inactivo hasta que se haga lo más lento y el resto de la lógica empresarial esté lista para continuar. En contraste, el enfoque de Node.js es programar las devoluciones de llamada que se van a invocar una vez que se hace algo lento; El subproceso único de Node.js nunca está inactivo, excepto si literalmente no hay solicitudes para procesar.

La diferencia principal entre Node.js y PHP es que en Node.js, el código se ejecuta en un contexto persistente que existe siempre que su servidor Node.js esté en ejecución. Por ejemplo, si escribe un valor en una variable global en una solicitud y luego lee el valor de la variable global en otra solicitud, la lectura verá el valor que fue escrito por la escritura. En contraste, en PHP, se crea un nuevo contexto para cada solicitud y, por lo tanto, las escrituras en globales en una solicitud se pierden cuando el script que maneja la solicitud termina.

    
respondido por el Nebu Pookins 03.07.2015 - 10:30
1

A diferencia de todos los demás servidores que ha mencionado, Node es un solo hilo, pero asíncrono. Como algunos han mencionado aquí, programa devoluciones de llamada en lugar de esperar a que se ejecute la operación y ejecuta devoluciones de llamada cuando la operación está completa, sin embargo, una serie de otras operaciones podría haberse procesado en el medio con el mismo hilo.

Caveats:

Aunque es un país de las maravillas para la programación asíncrona en la que no es necesario observar cómo sus subprocesos utilizan sus variables, si uno que no esté familiarizado con la forma en que Node funciona sería aplicar un enfoque síncrono regular, esto puede convertirse en una aplicación MUY muy lenta ya que cada solicitud se acumulará hasta que la primera solicitud finalice su acción ...

    
respondido por el Alexus 03.07.2015 - 22:33
0

Un programa Node es, en esencia, un programa normal, ni siquiera es un servidor web a menos que escriba un código específicamente para hacerlo (aunque eso es bastante fácil con la biblioteca HTTP integrada). Su programa obtendrá las solicitudes HTTP y su código puede responder de la forma que desee, utilizando todos los recursos disponibles para el programa.

Si JavaScript fuera una ejecución lineal de la vieja escuela, sin un código complicado y difícil de manejar, solo podría procesar una solicitud a la vez. Esto es bastante malo teniendo en cuenta que la mayor parte del tiempo empleado en el manejo de una solicitud web se suele pasar esperando en I / O.

Sin embargo, el flujo de programas de JavaScript se basa en eventos, establece un controlador como parte del código que se ejecuta cuando ocurre un evento, y cuando termina de manejar ese evento, JavaScript pasa automáticamente al siguiente evento en la cola de eventos. Si, por ejemplo, necesita una parte de los datos de la base de datos para manejar una solicitud, no solo espera a que la base de datos responda, configure un controlador de eventos que se activa cuando la base de datos responde (a menudo en forma de una función de devolución de llamada). ), y completa el trabajo cuando eso sucede, en el tiempo intermedio se pueden manejar muchos otros eventos.

Esto es lo que significa no bloquear, no detienes todo el programa porque necesitas esperar por algo.

Lo bueno es que aún escribes tu código de una forma principalmente lineal, por lo general no tienes que prestar mucha atención al orden de ejecución real.

    
respondido por el aaaaaaaaaaaa 04.07.2015 - 23:20

Lea otras preguntas en las etiquetas