Async.jsで並列実行がどのように機能するか知りたい
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")
}
]);
上記の例では、次の出力を取得することを期待しています。
機能:2
機能:1
しかし、コンソールは逆をスローします、何が起こっているのですか?ありがとう。
async
が最初にfunction: 1
を起動し、制御を解放してイベントループに戻さないため、予期しない答えが得られます。 function: 1
には非同期関数がありません。
Node.jsは、シングルスレッドの非同期サーバーです。長時間実行されているCPUタスクでイベントループをブロックすると、長時間実行されているCPUタスクが終了するまで、他の関数を呼び出すことはできません。
大きなforループの代わりに、httpリクエストを作成してみてください。例えば...
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);
});
}
]);
特別なライブラリ/モジュールを使用しない限り、Javascritはシングルスレッドです。したがって、このコードを実行すると、最初の関数が実行され、次に2番目の関数が実行されます。
Async.parallelが行う唯一のことは、すべての関数を実行し、すべての応答を待ってから、コールバックでコードを実行することです。
使用したすべてのコードが同期しているため、結果は同期になります。