2011-11-13 11 views
5

Técnicamente cuando ejecutamos el siguiente código (proceso recursivo.nexttick), el uso de CPU llegaría al 100% o cerca. La cuestión es imaginar que estoy ejecutando una máquina con una CPU y que hay otro proceso de funcionamiento del servidor HTTP del nodo, ¿cómo lo afecta?¿Utiliza el proceso recursivo.nexttick permite que otros procesos o subprocesos funcionen?

¿El hilo hace proceso recursivo.nexttick permite que el servidor HTTP funcione en absoluto?

Si tenemos dos hilos de proceso recursivo.nexttick, ¿ambos obtienen el 50% de cuota?

Como no conozco ninguna máquina con un núcleo no puedo probarlo. Y dado que mi comprensión del tiempo compartido de la CPU entre hilos es limitada en este caso, no sé cómo debería intentarlo con máquinas que tienen 4 núcleos de CPU.

function interval(){ 
    process.nextTick(function(){ 
    someSmallSyncCode(); 
    interval(); 
    }) 
} 

Gracias

+0

El nodo no tiene hilos. ¿Estás hablando de procesos completamente separados o cosas que suceden en la misma instancia de nodo? – thejh

+0

No, estoy hablando de dos procesos separados de nodo, no la misma instancia. –

+0

Editado, cambio de hilo a procesar. –

Respuesta

12

Para entender qué está sucediendo aquí, debe comprender algunas cosas sobre el bucle de eventos del nodo, así como sobre el sistema operativo y la CPU.

Antes que nada, vamos a entender mejor este código. Usted llama esto recursivo, ¿pero lo es?

En la recursión normalmente pensamos en pilas de llamadas anidadas y luego cuando se realiza el cálculo (alcanzando un caso base), la pila "se desenrolla" de nuevo al punto donde se llamó a nuestra función recursiva.

Si bien este es un método que se llama a sí mismo (indirectamente a través de una devolución de llamada), el bucle de evento sesga lo que realmente está sucediendo.

process.nextTick toma una función como una devolución de llamada y la pone primero en la lista de cosas que se deben realizar en la próxima vuelta del bucle de evento. Esta devolución de llamada se ejecuta y, cuando finaliza, vuelve a registrar la misma devolución de llamada. Esencialmente, la diferencia clave entre esto y la recursión real es que nuestra pila de llamadas nunca recibe más de una llamada profunda. Nunca "desenrollamos" la pila, solo tenemos montones pequeños de fichas en sucesión.

Bien, entonces, ¿por qué importa esto?

Cuando comprendemos mejor el bucle de eventos y lo que realmente está sucediendo, podemos comprender mejor cómo se utilizan los recursos del sistema. Al usar process.nextTick de esta manera, se asegura de que SIEMPRE hay algo que hacer en el ciclo de eventos, que es la razón por la que obtiene un alto uso de la CPU (pero ya lo sabía). Ahora, si tuviéramos que suponer que el servidor HTTP se postulara en el proceso mismo que el de la escritura, tal como por debajo

function interval(){ 
    process.nextTick(doIntervalStuff) 
} 

function doIntervalStuff() { 
    someSmallSyncCode(); 
    interval(); 
} 

http.createServer(function (req, res) { 
doHTTPStuff() 
}).listen(1337, "127.0.0.1"); 

entonces ¿cómo el uso de la CPU separarnos entre las dos diferentes partes del programa? Bueno, eso es difícil de decir, pero si comprendemos el ciclo de eventos, al menos podemos adivinar.

Como usamos process.nextTick, la función doIntervalStuff se ejecutará siempre al "inicio" del bucle de evento, sin embargo, si hay algo que hacer para el servidor HTTP (como manejar una conexión), entonces sepa que se hará antes de la próxima vez que se inicie el ciclo de eventos, y recuerde que, debido a la naturaleza del nodo que se desea, podría manejar cualquier cantidad de conexiones en una iteración del ciclo de eventos.Lo que esto implica es que, al menos en teoría, cada función en el proceso obtiene lo que "necesita" en cuanto al uso de la CPU, y luego las funciones process.nextTick utilizan el resto. Si bien esto no es exactamente cierto (por ejemplo, su código de bloqueo podría estropear esto), es un modelo lo suficientemente bueno para pensar.

Bien ahora (finalmente) en su pregunta real, ¿qué pasa con procesos separados?

Curiosamente, el sistema operativo y la CPU a veces también son muy "evented" en la naturaleza. Cuando un proceso quiere hacer algo (como en el caso de un nodo, inicia una iteración del ciclo de evento), realiza una solicitud al sistema operativo para que se maneje, el sistema operativo luego coloca este trabajo en una cola lista (que se prioriza) y se ejecuta cuando el programador de la CPU decide moverse. Esto es una vez más un modelo simplificado, pero el concepto central es que al igual que en el ciclo de eventos del nodo, cada proceso obtiene lo que "necesita" y luego un proceso como la aplicación de nodo intenta ejecutar siempre que sea posible rellenando el brechas.

Así que cuando su nodo procesa dice que toma el 100% de la CPU, eso no es exacto, de lo contrario, nada más se haría y el sistema fallaría. Básicamente, está ocupando toda la CPU que puede, pero el sistema operativo todavía determina otras cosas para deslizarse.

Si añadiera un segundo proceso de nodo que hiciera el mismo proceso.nextTick, el sistema operativo intentaría acomodar ambos procesos y, dependiendo de la cantidad de trabajo que deba realizarse en el ciclo de eventos de cada proceso de nodo, el sistema operativo dividiría el trabajo en consecuencia (al menos en teoría, pero en realidad probablemente conduciría a la desaceleración y la inestabilidad del sistema).

Una vez más, esto es muy simplista, pero con suerte le da una idea de lo que está sucediendo. Dicho esto, no recomendaría el uso de process.nextTick a menos que sepa que lo necesita, si es aceptable hacer algo cada 5 ms, usando un setTimeout en lugar de process.nextTick ahorrará montones en el uso de la CPU.

Espero que responda a su pregunta: D

1

No. Usted no tiene que hacer una pausa artificialmente sus procesos para permitir que otros hagan su trabajo, su sistema operativo tiene mecanismos para ello. De hecho, usar process.nextTick de esta manera ralentizará su computadora porque tiene mucha sobrecarga.

+0

Si tenemos dos hilos de proceso recursivo.nexttick, ¿ambos obtienen el 50% de cuota? –

+0

@alFReDNSH: De invocaciones, pero no de tiempo. – thejh

Cuestiones relacionadas