multithreading - thread - Agarrando el nodo JS alternativa al multihilo
node js parallel processing (5)
Bastante correcto, sí. El servidor node.js tiene un grupo de subprocesos interno para que pueda realizar operaciones de bloqueo y notificar al hilo principal con una devolución de llamada o evento cuando las cosas se completen.
Así que me imagino que hará un uso limitado de otro núcleo para el grupo de subprocesos, por ejemplo, si hace un sistema de archivos sin bloqueo, es probable que se implemente al contar un subproceso del grupo de subprocesos para realizar una lectura y establecer una devolución de llamada cuando está hecho, lo que significa que la lectura podría estar sucediendo en un hilo / núcleo diferente, mientras que el programa principal node.js está haciendo otra cosa.
Pero desde el punto de vista de node.js, es de un solo subproceso y no utilizará directamente más de un núcleo.
Si lo entiendo correctamente, Node JS no está bloqueando ... por lo que, en lugar de esperar una respuesta de una base de datos u otro proceso, se movió a otra cosa y vuelve a verificar más tarde.
También es de rosca simple.
Entonces, todo esto significa que un determinado proceso Node JS puede utilizar total y eficientemente un solo núcleo de CPU, pero no usará ningún otro núcleo en la máquina, como en, nunca usará más de uno a la vez.
Esto, por supuesto, significa que las otras CPU aún pueden ser utilizadas por otros procesos para cosas como la base de datos SQL u otras subrutinas pesadas de la CPU intencionalmente separadas, siempre que sean un proceso separado.
También en el caso de que el proceso Node JS tenga un bucle infinito o una función de ejecución prolongada, ese proceso ya no es útil de ninguna manera hasta que se detiene el bucle infinito o la función de ejecución prolongada (o se cancela todo el proceso).
¿Todo esto está bien? ¿Estoy en lo correcto en mi comprensión?
Desde esta pregunta hace casi 2 años. Las cosas se están haciendo diferentes o hay enfoques alternativos al problema de subprocesamiento múltiple en Node.JS
De acuerdo con la publicación de blog siguiente, utilizando la extensión de ''tarea'' entrante, algunos pueden beneficiarse directamente de otros núcleos disponibles.
http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html
Incluso si este es un hilo viejo, pensé, compartiría una idea, cómo utilizar más ese núcleo en la aplicación Node.JS. Como Nuray Altin ha mencionado, JXcore puede hacer eso.
Ejemplo simple:
var method = function () {
console.log("this is message from thread no", process.threadId);
};
jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);
// this is message from thread no 1
// this is message from thread no 0
Por defecto hay dos hilos (puede cambiarlo con jxcore.tasks.setThreadCount()
)
Por supuesto, hay mucho más que puedes hacer con las tareas. Los documentos están here .
Pocos artículos sobre ese tema:
Node.js es una aplicación de subproceso único, pero puede admitir concurrencia a través del concepto de evento y devolución de llamada. Aquí hay un video de Philip Roberts que explica cómo funcionan los bucles de eventos en JavaScript.
Haga clic aquí para ver el video
(En lugar de WebAPI hay API de C ++ en Node.js)
Sí, yo diría que tu comprensión es completamente correcta. Este artículo ( archived ) explica bastante bien el razonamiento detrás de este diseño. Este es probablemente el párrafo más importante:
Apache es multiproceso: genera un hilo por solicitud (o proceso, depende de la conf). Puede ver cómo esa sobrecarga consume memoria a medida que aumenta el número de conexiones simultáneas y se necesitan más hilos para servir a múltiples clientes simultáneos. Nginx y Node.js no son multiproceso, porque los hilos y procesos conllevan un gran costo de memoria. Son de subproceso único, pero basados en eventos. Esto elimina la sobrecarga creada por miles de subprocesos / procesos al manejar muchas conexiones en un solo subproceso.