2011-03-05 14 views
129

Si he entendido bien Nodo JS es no bloqueante ... así que en vez de esperar a una respuesta de una base de datos u otro proceso se trasladó a otra cosa y comprueba de nuevo más tarde.Agarrando la alternativa Nodo JS para multithreading

También es de rosca simple.

Todo esto significa que un proceso Node JS determinado 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 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 larga ejecución, ese proceso ya no es útil hasta que se detiene el bucle infinito o la función de larga ejecución (o se cancela todo el proceso).

¿Todo esto está bien? ¿Estoy en lo correcto en mi comprensión?

+2

"nodo" es _no_ solo subproceso. Solo el motor JS/V8 funciona en un solo hilo. La parte libuv de NodeJS tiene múltiples subprocesos. Consulte [¿Es realmente NodeJS de un solo subproceso?] (Http://stackoverflow.com/questions/7018093/is-nodejs-really-single-threaded) – RaelB

+1

Enganche http://stackoverflow.com/q/17959663/632951 – Pacerier

Respuesta

84

Más o menos correcta, 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 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 esto se implemente contando 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 subproceso/núcleo diferente, mientras que el programa principal node.js está haciendo otra cosa.

Pero desde un punto de vista node.js, es enteramente de un solo subproceso y no usar directamente más de un núcleo.

+2

Todavía soy nuevo en Node.js y aprecio la discusión aquí. Solo quería señalar que hacer suposiciones de que las llamadas no bloqueadas están respaldadas por llamadas de bloqueo con hilos probablemente no sean acertadas (no es que @jcoder sugiriera que el código del arquitecto se basara en estas suposiciones). En este caso, incluso si IO se maneja en un hilo separado con una llamada de bloqueo, ese hilo esperará básicamente en el IO de todos modos, por lo que no utilizará otros núcleos/CPU. Codifique la potencia de las herramientas que está utilizando y no se preocupe demasiado por los detalles de bajo nivel (hasta que se conviertan en un problema). – wbyoung

+0

para que podamos hacer otras pruebas usando devolución de llamada como código JavaScript en la interfaz – yussan

35

Sí, yo diría que su comprensión es completamente correcta. This article (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.

+0

El el artículo es falso Aunque existe un mpm de Apache multiproceso, es incompatible con prácticamente todas las configuraciones de uso cotidiano. Apache es multiproceso, y no multiproceso hasta ahora, y lo será, probablemente para siempre. Encuentro catastrófico, manipular los significados propios de la terminología es solo un buen intento para ocultar el problema, en lugar de resolverlo. – peterh

+1

@peterh No tiene sentido. El artículo es completamente correcto, indicando que apache es multiproceso o multiproceso dependiendo de la configuración. El caso de multiproces es aún peor con respecto al manejo de muchas conexiones, que es la única razón por la que Apache se menciona en primer lugar. Además, el módulo PHP muy utilizado es multiproceso por sí mismo. Y, por último, aunque no soy un experto en apache, mi impresión de otros artículos es que el MPM de los trabajadores es, de hecho, muy utilizado. –

+0

@MichaelBorgwardt Sí, apache puede ser multiproceso y también multiprocesamiento, no lo negué. Pero php es incompatible con la configuración de multiprocesos, y si usted fuera un experto de apache, seguramente lo sabría. El módulo de php comúnmente utilizado no es multiproceso. Tu información es falsa Sugiero probar una configuración de prueba y verá. Es una cuestión de hecho, no es cuestión de debate, pruébalo y verás. – peterh

13

Ya que esta pregunta fue hecha 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 siguiente publicación de blog, usando la extensión de 'tarea' entrante, algunos pueden beneficiarse directamente de otros núcleos disponibles.

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

26

Incluso si se trata de un viejo hilo, pensé, que iba a compartir con una idea, la forma de utilizar más de un núcleo en Node.JS aplicación. 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 (se puede cambiar con jxcore.tasks.setThreadCount())

Por supuesto hay mucho más que se puede hacer con las tareas. Los documentos son here.

algunos artículos sobre el tema:

1

Node.js es una aplicación de un solo subproceso, pero que puede soportar la concurrencia a través del concepto de evento y devoluciones de llamada. Aquí está el video por Philip Roberts que explica cómo funcionan los bucles de eventos en JavaScript.

Click here to see the video

(En lugar de WebAPIs hay APIs de C++ en Node.js)

+2

Esto debería ser un comentario – Cherniv