2013-06-16 36 views
17

Chcę wiedzieć, jak równoległe wykonywanie robót w async.jsNode.js - Async.js: w jaki sposób działa równoległe wykonanie?

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

W powyższym przykładzie, spodziewam się otrzymać wynik:

funkcja: 2

funkcja: 1

ale konsola wyrzuca odwrotność, co się dzieje? dzięki.

+8

Biblioteka 'asynchroniczna' nie przypisuje asynchronicznej funkcji task /'. Zakłada, że ​​zadania są już asynchroniczne i po prostu pomaga śledzić ich grupę. Żadne z twoich zadań nie jest asynchroniczne. –

Odpowiedz

22

Otrzymujesz odpowiedź, której się nie spodziewasz, ponieważ async uruchamia najpierw function: 1 i nie zwalnia kontroli z powrotem do pętli zdarzeń. Nie masz funkcji asynchronicznych w function: 1.

Node.js to jednoniciowy serwer asynchroniczny. Jeśli blokujesz pętlę zdarzeń przy użyciu długiego zadania procesora, nie można wywoływać żadnych innych funkcji, dopóki nie zakończy się długo działające zadanie procesora.

Zamiast dużej pętli spróbuj tworzyć żądania http. Na przykład ...

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

w tym przykładzie zwrócę dwa wywołania zwrotne, więc jak to działa? nie powinno być jedno wywołanie zwrotne, gdy oba te występują? – orepor

+0

To był tylko przykład wykonania dwóch żądań w tym samym czasie. Wyjście przechodzi do konsoli. Jeśli chcesz zebrać dane wyjściowe, potrzebujesz funkcji końcowej. Zapoznaj się z dokumentacją asynchroniczną, aby uzyskać więcej szczegółów na temat metody równoległej. – Daniel

8

Wstrzymanie jest jedno-wątkowe, chyba że używasz specjalnych bibliotek/modułów. Więc kiedy wykonasz ten kod, wykona on pierwszą funkcję, a następnie drugą.

Jedyne, co robi async.parallel to wykonanie wszystkich funkcji i oczekiwanie na wszystkie odpowiedzi, a następnie wykonanie kodu w wywołaniu zwrotnym.

Ponieważ cały kod używany jest synchroniczny, wynik będzie synchroniczny.