web-dev-qa-db-ja.com

Node.js-Async.js:並列実行はどのように機能しますか?

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

しかし、コンソールは逆をスローします、何が起こっているのですか?ありがとう。

17

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

特別なライブラリ/モジュールを使用しない限り、Javascritはシングルスレッドです。したがって、このコードを実行すると、最初の関数が実行され、次に2番目の関数が実行されます。

Async.parallelが行う唯一のことは、すべての関数を実行し、すべての応答を待ってから、コールバックでコードを実行することです。

使用したすべてのコードが同期しているため、結果は同期になります。

8
Kaizo