2012-04-06 12 views
5

Desidero aggiungere alcune utilità di amministrazione a una piccola app Web, ad esempio "Database di backup". L'utente farà clic su un pulsante e la risposta HTTP verrà restituita immediatamente, sebbene il processo potenzialmente di lunga durata sia stato avviato in background.Comportamento "spawn a thread" in node.js

In Java questo probabilmente verrà implementato creando un thread indipendente, in Scala utilizzando un attore. Ma qual è un idioma appropriato in node.js? (codice snippet apprezzato)

Ora sto rileggendo i documenti, questo sembra davvero un problema 101 nodo ma è più o meno dove sono su questo ... comunque, per chiarire questo è lo scenario di base:

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

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

Desidero che la risposta venga restituita immediatamente, lasciando doSomething() in esecuzione in background.

Ok, dato il modello single-thread del nodo che non sembra possibile senza generare un altro ChildProcess a livello di sistema operativo. Il mio fraintendimento

Nel mio codice, quello di cui ho bisogno per il backup è principalmente basato sull'I/O, quindi il nodo dovrebbe gestirlo in modo asincrono. Quello che penso di fare è spostare il doSomething dopo il response.end, vedere come si comporta.

+0

Confido che tu abbia sfogliato la documentazione. http://nodejs.org/docs/v0.4.7/api/index.html Penso che dipenda dalla natura del tuo processo, ma dai un'occhiata a Child Process. – supertopi

+0

Grazie. Sembra che il mio problema fosse radicato in un profondo fraintendimento su come funziona il nodo :) Child Process era quello che avevo in mente, anche se non la soluzione più semplice, vedi la risposta di Joe in basso. – danja

risposta

3

Non vedo il problema. Tutto ciò che devi fare è avere doSomething() avviare un'operazione asincrona. Tornerà immediatamente, il tuo onRequest scriverà la risposta, e il client riceverà il messaggio "OK, ho iniziato".

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 non sarà solo stare lì fino a quando viene stabilita la connessione al database, o attendi che si dice di eseguire il backup. Ritornerà subito dopo aver registrato una richiamata che verrà eseguita in un secondo momento. Dietro le quinte, la libreria di database probabilmente sta creando alcuni thread per te, per far sì che l'asincrono funzioni come dovrebbe, ma il tuo codice non deve preoccuparsi di ciò; si ritorna subito, si invia subito la risposta al client e il codice asincrono continua a essere eseguito in modo asincrono.

(in realtà è più lavoro per rendere questo percorso in modo sincrono -. Si dovrà passare l'oggetto response in doSomething, e hanno doSomething fare il response.end chiamata all'interno della richiamata più interno, dopo il backup è fatto Naturalmente, questo non è cosa vuoi fare qui, vuoi tornare immediatamente, che è esattamente quello che farà il tuo codice.)

+0

Grazie. Sembra che il mio problema sia stato radicato in un profondo malinteso su come funziona il nodo :) – danja

5

Come supertopi ha detto che si potrebbe dare un'occhiata a Child process. Ma penso che danneggerà le prestazioni del tuo server, se questo accade molto in modo sequenziale. Quindi penso che dovresti fare la fila invece. Penso che dovresti dare un'occhiata a asynchronous message queues per elaborare i tuoi lavori offline (distribuiti). Alcuni (solo per citare due) esempi di code di messaggi sono beanstalkd, gearman.

+0

Grazie. Sembra che il mio problema fosse radicato in un profondo fraintendimento su come funziona il nodo :) L'uso di una coda però sembra un'ottima idea. – danja

Problemi correlati