2012-04-06 9 views
5

Quiero agregar algunas utilidades de administrador a una pequeña aplicación web, como "Backup Database". El usuario hará clic en un botón y la respuesta HTTP volverá de inmediato, aunque el proceso potencialmente de larga ejecución se haya iniciado en segundo plano.Comportamiento similar a "engendrar un hilo" en node.js

En Java esto probablemente se implementaría al generar un hilo independiente, en Scala utilizando un Actor. Pero, ¿qué es una expresión apropiada en node.js? (fragmento de código apreciado)

Ahora estoy volviendo a leer los documentos, esto realmente parece una pregunta del nodo 101, pero eso es más o menos donde estoy en esto ... de todos modos, para aclarar este es el escenario básico:

function onRequest(request, response) { 
    doSomething(); 
    response.writeHead(202, headers); 
    response.end("doing something"); 
} 

function doSomething(){ 
    // long-running operation 
} 

Quiero que la respuesta vuelva inmediatamente, dejando doSomething() ejecutándose en segundo plano.

Bien, dado el modelo de nodo de subproceso único que no parece posible sin generar otro ChildProcess de nivel de sistema operativo. Mi malentendido.

En mi código, lo que necesito para la copia de seguridad es principalmente basado en E/S, por lo que el nodo debe manejar eso en una buena manera asíncrona. Lo que creo que haré es cambiar el doSomething a después de la respuesta. Y vea cómo se comporta.

+0

Confío en que ha hojeado la documentación. http://nodejs.org/docs/v0.4.7/api/index.html Creo que depende de la naturaleza de su proceso, pero eche un vistazo a Child Process. – supertopi

+0

Gracias. Parece que mi problema se debió a un profundo malentendido sobre cómo funciona el nodo :) Child Process fue lo que tenía en mente, aunque no es la solución más fácil, consulte la respuesta de Joe a continuación. – danja

Respuesta

3

No veo el problema. Todo lo que necesita hacer es tener doSomething() iniciar una operación asincrónica. Volverá inmediatamente, su onRequest escribirá la respuesta y el cliente recibirá su mensaje "OK, comencé".

function doSomething() { 
    openDatabaseConnection(connectionString, function(conn) { 
     // This is called some time later, once the connection is established. 
     // Now you can tell the database to back itself up. 
    }); 
} 

doSomething no va a sentarse allí hasta que se establezca la conexión de base de datos, o esperar a que usted le diga que una copia de seguridad. Volverá de inmediato, habiendo registrado una devolución de llamada que se ejecutará más tarde. Detrás de escena, la biblioteca de su base de datos probablemente está creando algunos subprocesos para usted, para hacer que la sincronización funcione como debería, pero su código no necesita preocuparse por eso; usted acaba de regresar de inmediato, envía la respuesta al cliente de inmediato, y el código asíncrono sigue ejecutándose de forma asíncrona.

(en realidad es más trabajo para hacer esta carrera de forma sincrónica -. Que tendría que pasar su objeto response en doSomething, y tienen doSomething hacer la llamada response.end dentro de la devolución de llamada interna, después de la copia de seguridad se realiza Por supuesto, eso no es lo que quiere hacer aquí; desea regresar inmediatamente, que es exactamente lo que hará su código.)

+0

Gracias. Parece que mi problema estaba enraizado en un profundo malentendido sobre cómo funciona el nodo :) – danja

5

Como supertopi dijo que podría echar un vistazo a Child process. Pero creo que perjudicará el rendimiento de su servidor, si esto sucede de forma secuencial. Entonces creo que deberías ponerlos en cola. Creo que debería echar un vistazo a asynchronous message queues para procesar sus trabajos fuera de línea (distribuido). Algunos (solo para nombrar dos) ejemplos de colas de mensajes son beanstalkd, gearman.

+0

Gracias. Parece que mi problema estaba enraizado en un profundo malentendido sobre cómo funciona el nodo :) Sin embargo, usar una cola parece una muy buena idea. – danja

Cuestiones relacionadas