multithreading - thread - Cómo crear hilos en nodejs
nodejs process send (8)
Ahora también existe https://github.com/xk/node-threads-a-gogo , aunque no estoy seguro del estado del proyecto.
¿Hay alguna manera de crear subprocesos para ejecutar múltiples métodos a la vez? Si cualquier método falla entre todos los otros hilos, debe ser eliminado.
Gracias por adelantado
Cada proceso de node.js tiene un único hilo por diseño. Por lo tanto, para obtener múltiples hilos, debe tener múltiples procesos (como han señalado otros carteles, también hay bibliotecas a las que se puede vincular que le permitirán trabajar con hilos en Nodo, pero no existe esa capacidad sin esas bibliotecas). . Ver la respuesta de Shawn Vincent haciendo referencia a https://github.com/audreyt/node-webworker-threads )
Puede iniciar procesos secundarios desde su proceso principal como se muestra aquí en la documentación de node.js: http://nodejs.org/api/child_process.html . Los ejemplos son bastante buenos en esta página y son bastante sencillos.
El proceso principal puede entonces observar el evento cercano en cualquier proceso iniciado y luego forzar el cierre de los otros procesos en los que se inició para lograr el tipo de estrategia de parada completa fallida de la que está hablando.
Ver también: Node.js en máquinas multi-core
Necesitaba multihilo real en Node.js y lo que funcionó para mí fue el paquete de threads . Genera otro proceso que tiene su propio bucle de mensaje Node.js, por lo que no se bloquean entre sí. La configuración es fácil y la documentación te permite trabajar rápidamente. Su programa principal y los trabajadores pueden comunicarse de ambas maneras y los "hilos" de los trabajadores pueden ser eliminados si es necesario.
Dado que multihilo y Node.js es un tema complicado y ampliamente discutido, fue bastante difícil encontrar un paquete que funcione para mi requerimiento específico. Para el registro, estos no funcionaron para mí :
- tiny-worker permitió a los trabajadores engendrar, pero parecían compartir el mismo ciclo de mensajes (pero podría ser que hice algo mal - los threads tenían más documentación que me daba confianza, realmente usaba múltiples procesos, así que seguí trabajando hasta que funcionó)
- webworker-threads no permitió la solicitud de módulos en los trabajadores que necesitaba
Y para aquellos que preguntan por qué necesitaba un multihilo verdadero : para una aplicación que involucra el Raspberry Pi e interrumpe. Un hilo está manejando esas interrupciones y otro se ocupa de almacenar los datos (y más).
Puede obtener multi-threading usando Napa.js.
https://github.com/Microsoft/napajs
"Napa.js es un motor de ejecución multiproceso de JavaScript basado en V8, que fue diseñado originalmente para desarrollar servicios altamente iterativos con un rendimiento no comprometido en Bing. A medida que evoluciona, nos resulta útil para complementar Node.js en tareas vinculadas a la CPU. , con la capacidad de ejecutar JavaScript en múltiples aislamientos de V8 y comunicarse entre ellos. Napa.js se expone como un módulo Node.js, mientras que también se puede incrustar en un proceso de host sin la dependencia de Node.js ".
Si está utilizando Rx, es bastante simple de instalar en rxjs-cluster para dividir el trabajo en ejecución paralela. (descargo de responsabilidad: soy el autor)
También hay al menos una biblioteca para hacer threading nativo desde Node.js: node-webworker-threads
https://github.com/audreyt/node-webworker-threads
Esto básicamente implementa la API del navegador Web Worker para node.js.
Desde el Nodo 10.5 ahora hay compatibilidad con múltiples hilos , pero es experimental . Espero que esto se estabilice pronto.
Pagar los siguientes recursos:
Es posible que esté buscando Promise.race
(solución de carreras de E / S nativa, no hilos)
Asumiendo que usted (u otras personas que buscan esta pregunta) quiere competir con los hilos para evitar fallas y evitar el costo de las operaciones de E / S, esta es una manera simple y nativa de lograrlo (que no usa hilos). El nodo está diseñado para ser de un solo subproceso (buscar el bucle de evento), así que evita usar subprocesos si es posible. Si mi suposición es correcta, le recomiendo que use Promise.race
con setTimeout
(ejemplo en el enlace). Con esta estrategia, compite con una lista de promesas que cada una prueba alguna operación de E / S y rechaza la promesa si hay un error (de lo contrario, se agota el tiempo de espera). La instrucción Promise.race
continúa después de la primera resolución / rechazo, que parece ser lo que quieres. ¡Espero que esto ayude a alguien!