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. git rebase en funciones de larga duración (remoto) ramas
- 8. Rieles rebase las migraciones en un proyecto de larga duración
- 9. Solicitudes de larga duración y autodirección en Django
- 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. Almacenar sin signo de larga duración con Core Data
- 17. ¿Es adecuado BackgroundWorker para una operación de larga duración?
- 18. Duración de la sesión en node.js con express y MongoDB
- 19. Continuar con la información sobre cómputos anteriores
- 20. Proceso de fondo de larga duración en ASP.NET - ¿Proceso de aplicación o separado?
- 21. ¿Arquitectura general para un sistema de procesamiento de datos de larga duración en Java?
- 22. almacenar valor de larga duración en la base de datos de Android
- 23. "Mantener" con maestro remoto cuando se trabaja en una rama de tema local de larga duración
- 24. ¿Por qué hacer objetos pequeños y de larga duración una diferencia en la recolección de basura?
- 25. ejecución y terminación de un proceso por lotes de larga duración en Python
- 26. Solución al problema de larga duración consulta en una aplicación web (solicitud asincrónica)
- 27. cola no de mensaje/larga duración simple en Python (y frasco)
- 28. ¿Cómo implementar un programa python basado en eventos de larga duración?
- 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