Come può NodeJS essere "non-bloccante"?

14

Sto imparando NodeJS e volevo solo chiarire qualcosa. In molti tutorial e libri introduttivi finora, molto presto hanno descritto l'architettura "non bloccante" di Node - o piuttosto che è possibile (e consigliato, l'intero punto) di codificare in modo non bloccante.

Quindi, ad esempio, questo esempio è stato fornito in un libro che sto leggendo di un modo asincrono per ottenere dati da un database.

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

Ciò che accade (a quanto ho capito) è che il nodo effettua la chiamata al database, quindi continua l'elaborazione di ciò che potrebbe essere successivo nello stack di chiamate. Quando la richiesta del database è completa, la variabile di dati nella funzione di callback anonima verrà popolata e quella funzione aggiunta allo stack di chiamate (e successivamente eseguita quando il nodo lo raggiunge).

La mia domanda è, che cosa è esattamente l'elaborazione la richiesta del database? Sicuramente il nodo deve bloccare mentre lo fa? Cosa si sta prendendo cura della richiesta del database? Oppure se il nodo è in attesa su una richiesta HTTP GET asincrona a una risorsa esterna, cosa si sta prendendo cura di quella richiesta che consente al nodo di continuare ad elaborare lo stack di chiamate e di essere "non-bloccante"?

    
posta Anonymous 19.06.2013 - 11:56
fonte

1 risposta

17

Quando Node.js è descritto come "non-blocco", ciò significa in particolare che il suo IO non è bloccante. Il nodo usa libuv per gestire il proprio IO in modo indipendente dalla piattaforma. Su Windows, usa le porte di completamento dell'IO, su Unix, usa epoll / kqueue / select / etc. Quindi, fa una richiesta di IO non bloccante (che può avere un monitoraggio del thread in background, ma questo non è mai esposto a JavaScript) e su un risultato, lo accoda nel ciclo degli eventi che chiama il callback JavaScript sul main (leggi: solo) thread JavaScript.

Per i database, dipende da come è scritta la libreria. Se usa HTTP per comunicare (come fanno alcuni database NoSQL), allora potrebbe essere facilmente scritto in puro JavaScript usando la libreria standard http del nodo. Se lo fa in un altro modo, beh, questo dipende dalla biblioteca. Potrebbe essere scritto in C / C ++ e utilizzare thread in background a condizione che l'astrazione non sia mai esposta a JavaScript.

Per quanto riguarda la tua domanda su cosa "elabora" la richiesta del database, idealmente tutto ciò che dovrebbe essere fatto è inviare un semplice messaggio a una libreria (ad esempio un'istruzione SQL o qualche altra query o una richiesta di connessione), e punta il tuo JavaScript continua a sbavare. Quando la libreria è pronta per inviare un messaggio, invia un messaggio alla coda degli eventi del nodo che esegue la richiamata, consentendo l'esecuzione dello snippet di codice.

    
risposta data 19.06.2013 - 12:23
fonte

Leggi altre domande sui tag