2013-06-16 9 views
17

Ich möchte, wie die parallele Ausführung in async.js arbeitet wissenNode.js - Async.js: Wie funktioniert die parallele Ausführung?

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") 
    } 
]); 

Im obigen Beispiel erwarte ich, dass die Ausgabe erhalten:

Funktion: 2

Funktion: 1

aber die Konsole führt den inversen, was geschieht? Vielen Dank.

+8

Die 'async' Bibliothek machen keine Aufgabe /' function' asynchron. Es nimmt an, dass die Aufgaben bereits asynchron sind und hilft Ihnen einfach, eine Gruppe von ihnen zu verfolgen. Und keine Ihrer Aufgaben ist asynchron. –

Antwort

22

Sie erhalten die Antwort, die Sie nicht erwarten, weil async zuerst function: 1 startet und die Steuerung nicht zurück in die Ereignisschleife gibt. Sie haben keine asynchronen Funktionen in function: 1.

Node.js ist ein Single-Threaded-Asynchron-Server. Wenn Sie die Ereignisschleife mit einer lang laufenden CPU-Task blockieren, können keine anderen Funktionen aufgerufen werden, bis Ihre lang andauernde CPU-Task beendet ist.

Statt für eine große Schleife für versuchen, HTTP-Anfragen. Zum Beispiel ...

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 diesem Beispiel werde ich zwei Callbacks zurückgeben, also wie funktioniert das? sollte es nicht einen einzigen Rückruf geben, sobald beide auftreten? – orepor

+0

Dies war nur ein Beispiel für die gleichzeitige Ausführung von zwei Anfragen. Die Ausgabe geht zur Konsole. Wenn Sie die Ausgabe sammeln möchten, benötigen Sie eine letzte Funktion. Weitere Informationen zur parallelen Methode finden Sie in der asynchronen Dokumentation. – Daniel

8

Javascrit ist single-threaded, es sei denn, Sie verwenden spezielle Bibliotheken/Module. Wenn Sie diesen Code ausführen, wird die erste Funktion und dann die zweite ausgeführt.

Das einzige, was async.parallel tut, ist, alle Funktionen auszuführen und für alle Antworten warten und dann den Code in den Rückruf auszuführen.

Da alle Code, den Sie verwendet synchron ist das Ergebnis ein synchron sein.