2011-10-08 13 views
36

Poiché molti script node.js seguono uno schema per fare qualcosa in modo asincrono (esempio sotto), come fanno a sapere quando fermarsi?Come fa un processo node.js a sapere quando fermarsi?

Nel codice seguente, in che modo il nodo determina dopo l'elaborazione di writeFile e registrando il callback in modo appropriato, che il processo deve essere mantenuto attivo finché non viene eseguito il callback?

fs = require('fs'); 

fs.writeFile('foo', 'cat', function() { 
    console.log('wrote to foo!'); 
    fs.readFile('foo', 'utf8', function(err, data) { 
    console.log(data); 
    }); 
}); 

risposta

40

nodo tiene traccia di tutte le richieste di lavoro in sospeso. La chiamata fs.writefile() crea una richiesta di lavoro per I/O e aggiunge la richiamata a quella richiesta. nodo salva la richiesta di lavoro nelle sue tabelle contemporaneamente all'avvio dell'attività di I/O. L'esecuzione del codice termina quando raggiungi la fine della tua funzione. (Ma la tua memoria/variabili/ecc. Rimangono)

Più tardi l'I/O termina e il nodo estrae la richiesta di lavoro dalle sue tabelle. Vede il callback allegato alla richiesta e quindi chiama quella funzione con i risultati della richiesta I/O. I tuoi dati globali sono ancora in circolazione e tutte le variabili nelle chiusure esistono ancora, quindi sembra che il tuo codice non si sia mai fermato.

Se non si fa altro, non fare più richieste, quindi quando si ritorna dalle proprie funzioni il nodo si fermerà, perché non ci saranno più richieste rimanenti nelle code.

Quindi il nodo 'sa' di continuare a funzionare perché tiene traccia delle richieste di lavoro attive nelle sue tabelle e non si interrompe finché non viene eseguito tutto il lavoro in coda e le tabelle sono vuote.

Si noti che "lavori in coda" possono includere aspetti come l'attesa per i timer o l'attesa di dati di rete. Fai una richiesta che dice "chiamami qui quando/se succede qualcosa dopo".

setTimeout() è anche una richiesta di lavoro (se si strizza un po '). Con un timer sai che succederà qualcosa e quando accadrà. Con setTimeout() succederà solo un "qualcosa". il nodo effettuerà una sola chiamata alla richiamata e quindi "dimenticherà" la richiesta di lavoro. Se invece utilizzi setInterval() hai creato una richiesta di lavoro persistente. il nodo "manterrà" la richiesta di lavoro nelle sue tabelle e chiamerà ripetutamente la richiamata, finché non si annulla la richiesta.

net.Server.listen() è un'altra richiesta di lavoro che è una richiesta di lavoro persistente. Non sai quando verrà richiamato il tuo callback o quante volte, poiché ciò dipende dai client remoti che si connettono al tuo server. node mantiene attiva la richiesta di lavoro nelle sue tabelle finché non si annulla la richiesta.

+15

I concetti di richieste e tabelle di lavoro sono stati creati per illustrare il punto o sono questi effettivi costrutti utilizzati nell'implementazione del nodo? Chiedo perché non vedo questi termini usati da nessun'altra parte. – d512

+0

Credo che le richieste di lavoro siano note come attività e le tabelle sono note come code delle attività. Vedi https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ –

Problemi correlati