2013-06-16 8 views
17

Voglio sapere come parallelo esecuzione opere in async.jsNode.js - Async.js: come funziona l'esecuzione parallela?

async = require('async') 

async.parallel([ 
    function(callback){ 
     for (var i = 0; i < 1000000000; i++) /* Do nothing */; 
     console.log("function: 1") 
    }, 
    function(callback){ 
     console.log("function: 2") 
    } 
]); 

Nell'esempio di cui sopra, mi aspetto di ottenere l'output:

funzione: 2

funzione: 1

ma, la console tiri l'inverso, ciò che sta accadendo? Grazie.

+8

La biblioteca 'async' non rende un compito /' function' asincrono. Presuppone che le attività siano già asincrone e semplicemente ti aiuta a tenere traccia di un gruppo di esse. E nessuno dei tuoi compiti è asincrono. –

risposta

22

Si ottiene la risposta che non ti aspetti perché async avvia function: 1 e non rilascia nuovamente il controllo sul ciclo degli eventi. Non hai funzioni asincrone in function: 1.

Node.js è un server asincrono singolo thread. Se si blocca il ciclo degli eventi con un'attività CPU a esecuzione prolungata, non è possibile chiamare altre funzioni fino al termine dell'attività CPU a esecuzione prolungata.

Invece per un grande ciclo for, provare a fare richieste http. Ad esempio ...

async = require('async') 
request = require('request') 

async.parallel([ 
    function(callback){ 
     request("http://google.jp", function(err, response, body) { 
     if(err) { console.log(err); callback(true); return; } 
     console.log("function: 1") 
     callback(false); 
     }); 
    }, 
    function(callback){ 
     request("http://google.com", function(err, response, body) { 
     if(err) { console.log(err); callback(true); return; } 
     console.log("function: 2") 
     callback(false); 
     }); 
    } 
]); 
+0

in questo esempio, passerò di nuovo due callback, quindi come funziona? non dovrebbe esserci una sola richiamata una volta che si verificano entrambi? – orepor

+0

Questo era solo un esempio di due richieste contemporaneamente. L'output va alla console. Se vuoi raccogliere l'output avrai bisogno di una funzione finale. Controlla la documentazione asincrona per maggiori dettagli sul metodo parallelo. – Daniel

8

Javascrit è a thread singolo a meno che non si utilizzino librerie/moduli speciali. Quindi quando esegui questo codice eseguirà la prima funzione e poi la seconda.

L'unica cosa che fa è async.parallel eseguire tutte le funzioni e attendere tutte le risposte, e quindi eseguire il codice nel callback.

Perché tutto il codice è stato utilizzato è sincrono il risultato sarà un sincrono.