javascript - nodejs - node js events tutorial
¿Cómo escribo código no bloqueante en Node.js? (2)
Puedo escribir I/O sin bloqueo en Node.js muy fácilmente. Es para lo que está configurada toda la biblioteca.
Pero cualquier cálculo hecho está bloqueando. Cualquier mensaje que pase por emisores de eventos está bloqueando .
Por ejemplo, los eventos emisores se resuelven inmediatamente y, por lo tanto, se bloquean:
var e = new process.EventEmitter;
e.on("foo", function() {
console.log("event");
});
process.nextTick(function() {
console.log("next tick");
});
setTimeout(function() {
console.log("timeout");
}, 0);
e.emit("foo");
> event
> next tick
> timeout
Además de nextTick
llamadas en nextTick
, ¿cómo puedo hacer que el código no se bloquee?
Quiero hacer el menor cálculo posible por ciclo del ciclo de eventos, de modo que pueda atender a tantos clientes simultáneamente como sea posible.
¿Cómo escribo mi código de forma no bloqueante?
Y cuando tengo un código sin bloqueo, ¿cómo puedo escalar eso a través de múltiples procesos?
Una opción es esperar a que finalice la API del subproceso WebWorker.
JavaScript es de un solo hilo. Eso significa que, independientemente de los eventos, tiempos de espera o demoras con nextTick, cualquier cálculo realizado bloqueará todo el proceso.
Si divide su procesamiento en pasos usando process.nextTick
, como se hace con setTimeout(fn, 0)
en el lado del cliente para evitar el bloqueo de la interfaz de usuario, puede distribuir su carga de trabajo en un período de tiempo más largo, dando espacio para otras funciones. correr.
Pero esa es una solución muy inefectiva: la cantidad total de trabajo es la misma, distribuida entre todos los ciclos (haciendo que cada solicitud sea un poco más lenta). En la práctica, cualquier tipo de cálculo que se espere más de unos pocos milisegundos debe descargarse a un proceso diferente. Para maximizar la concurrencia, siempre debe volver al bucle de eventos lo más rápido posible .
child_process.fork()
se agregó a v0.5 hace unos días. Simplifica la creación y la comunicación de procesos secundarios, no es exactamente la API de los trabajadores web, pero se cierra, consulte la URL https://github.com/joyent/node/blob/master/doc/api/child_process.markdown .
No hay multihilo real en JavaScript y eso es lo que necesita para que la llamada no se bloquee. Lo único en lo que puedo pensar son los trabajadores web: https://developer.mozilla.org/en/Using_web_workers