Estoy escribiendo un servidor de juegos en node.js, y algunas operaciones implican cálculos intensos en una parte del servidor. No quiero dejar de aceptar conexiones mientras ejecuto esos cálculos: ¿cómo puedo ejecutarlos en segundo plano cuando node.js no admite subprocesos?Cómputos de larga duración en node.js
Respuesta
No puedo responder por ninguno de estos, personalmente, pero si está empeñado en hacer el trabajo en proceso, ha habido un par de implementaciones independientes de la API de WebWorkers para el nodo, como se enumera en la página de módulos de nodo:
- http://github.com/cramforce/node-worker
- http://github.com/pgriess/node-webworker
A primera vista, la segundo parece más maduro, y ambos te permitirán esencialmente hacer una programación enhebrada, pero básicamente es actor-modelo, así que todo es ne con el envío de mensajes, y no puede haber compartido estructuras de datos ni nada.
Además, por lo que vale la pena, el equipo node.js tiene la intención de implementar precisamente esta API de forma nativa, con el tiempo, por lo que estas herramientas, aunque no sean perfectas, pueden constituir un obstáculo decente.
y algunas operaciones implican pesada cálculo por parte del servidor
¿Cómo escribir código que es pesado cómputo en el primer lugar. Eso es muy difícil de hacer en node.js.
cómo puedo ejecutar en segundo plano cuando Node.js no soporta hilos
que podría generar un par de casos de trabajadores (nodo) y comunicarse con la aceptación de conexiones (instancia de nodo) usando por ejemplo redis block pop. La biblioteca redis de Node.js no tiene ningún bloqueo.
No es difícil en absoluto. Estoy recorriendo un mapa de juego que es 128x128x128 = 2 millones de bloques, o cosas más grandes y calculadoras. – nornagon
... o cualquier tipo de procesamiento de imagen. – nornagon
Este enfoque debería funcionar. Debería dividirse y conquistar mediante el envío de mensajes (operaciones de lista de bloqueo). – Alfred
var spawn = require('child_process').spawn;
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need
//then you can attach events to that list like this
listorwhatev.on('exit', function(code){});
///or in this ls example as it streams info
listorwhatev.stdout.on('data', function(info){sys.puts(info);});
Asegúrese de que el proceso de generación se produce una vez por aplicación, luego alimente con material y mire los eventos por conexión. también debe verificar que el listorwhatev todavía se está ejecutando antes de manejarlo. Como a todos nos encantan esos errores no detectados en el nodo que bloquea la aplicación, no;) Cuando se sale del spawn (pid) aunque se produzca un kill o algo malo en tu máquina y no salgas del spawn en tu código correctamente, su controlador de eventos de transmisión bloqueará su aplicación.
Voy a pasar varios megabytes de datos de ida y vuelta; stdout/stdin realmente no se siente óptimo ... – nornagon
- 1. 'Servicio' de Android de larga duración
- 2. Escribir el servicio WCF de larga duración
- 3. asp.net ThreadPool - operación de larga duración
- 4. ¿Qué clase de datos es "larga duración"?
- 5. setInterval y funciones de larga duración
- 6. cancelación de orquestación en prueba de unidad de larga duración
- 7. Solicitudes de larga duración y autodirección en Django
- 8. Rieles rebase las migraciones en un proyecto de larga duración
- 9. git rebase en funciones de larga duración (remoto) ramas
- 10. Consideraciones de multijugador de juego RTS de larga duración
- 11. Los trabajos de larga duración de Sidekiq siguen muriendo
- 12. Iniciar una tarea de fondo de larga duración
- 13. Enfoque para manejar procesos de larga duración con Camel
- 14. android operación de larga duración para actualizar un appwidget
- 15. Conexiones AJAX de larga duración bloqueadas por el Anti-Virus
- 16. Duración de la sesión en node.js con express y MongoDB
- 17. ¿Es adecuado BackgroundWorker para una operación de larga duración?
- 18. Almacenar sin signo de larga duración con Core Data
- 19. Continuar con la información sobre cómputos anteriores
- 20. almacenar valor de larga duración en la base de datos de Android
- 21. Proceso de fondo de larga duración en ASP.NET - ¿Proceso de aplicación o separado?
- 22. ¿Arquitectura general para un sistema de procesamiento de datos de larga duración en Java?
- 23. ejecución y terminación de un proceso por lotes de larga duración en Python
- 24. ¿Por qué hacer objetos pequeños y de larga duración una diferencia en la recolección de basura?
- 25. "Mantener" con maestro remoto cuando se trabaja en una rama de tema local de larga duración
- 26. Solución al problema de larga duración consulta en una aplicación web (solicitud asincrónica)
- 27. ¿Cómo implementar un programa python basado en eventos de larga duración?
- 28. cola no de mensaje/larga duración simple en Python (y frasco)
- 29. Creación de perfiles de un servidor de Python de larga duración
- 30. Cómo informe de situación de la función de PostgreSQL de larga duración a cliente
ryah sugirió node-webworker cuando le hice esta pregunta :) – nornagon
un intento reciente de este problema mencionado en http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html – BigbangO
Otra publicación de blog manejando esto: http : //neilk.net/blog/2013/04/30/why-you-should-use-nodejs-for-CPU-bound-tasks/ – loveNoHate