0

私はエクスプレスアプリを持っています。実行したい関数の配列に対して並列フローが必要です。そのために非同期モジュールを使用することを考えています。

これよりも優れたモジュールが他にあるかどうか知りたいですか?

次に、これらの関数が非同期である必要があるかどうかを知りたいですか? このようなコードがあるとしましょう

var sum = function(x, y){
   return (x + y)
}

async.parallel([
    function(callback){
        setTimeout(function(){
            result = sum (x, y); //just an example for a synchronous function
            callback(null, result);
        }, 100);
    },
    function(callback){
        result = sum (x, y); //just an example for a synchronous function
        callback(null, result);
    }

],
// optional callback
function(err, results){
    console.log(result);
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

この中にできるように、同期する関数があります。では、この 2 つはまだ並行して実行されますか?

また、node.js はシングル スレッドであるため、node.js では I/O タスクのみを並列実行できると聞いています。本当ですか?したがって、非同期モジュールでも I/O タスクがないと、それらは並行して実行されず、単に表示されるだけでしょうか?

助けてください。

4

3 に答える 3

2

Node.js はシングル スレッドであり、(そのままで)シングル コアです。

そのため、Node.js はシングル スレッドであるため、の並列性はありません。

このasync.parallelメソッドは、タスクに非同期コードが含まれている場合にのみ役立ちます。すべての応答を待ってから、コールバックでコードを実行します。 ただし、タスクに同期コードのみが含まれている場合、結果は同期になります。

したがって、最後の質問に対する答えはyesです。

別の制御フロー モジュールを試してみたい場合は、Qを試してください。Javascript Promises を実装し、非同期コードを読みやすく整理しやすくします。

タスクを真に並列化したい場合は、子プロセスまたはクラスター モジュールを見てください。

スレッド化を実装するThreads à gogoなどの特別なネイティブ モジュールもあります。


コードの完全な例:

var async = require('async');

sum = function(x, y) {
  return (x + y)
}

x = 2;
y = 3;

async.parallel([
    function(callback) {
      setTimeout(function() {
        result = sum(x, y);
        console.log('f1');
        callback(null, result);
      }, 100);
    },
    function(callback) {
      result = sum(x, y);
      console.log('f2');
      callback(null, result);
    }

  ],

  function(err, results) {
    console.log(result);
  }
);

このコードを実行すると、出力結果は常に次のようになりますf2, f1, 5。これはsetTimeout最初の関数が原因ですが、コードの実行方法は同期的です。

納得したい場合は、最初の関数で setTimeout を削除し、出力が常にf1, f2, 5.

そう:

  • async.parallel は、2 つの HTTP リクエスト (非同期) を同時に実行し、両方が完了するのを待つ場合に非常に便利です。

  • async.parallel は、コードが同期的に実行されるため、同期コードを配置した場合には役に立ちません。

于 2013-07-14T19:13:31.537 に答える
1

async は、これらの種類のタスクの事実上のモジュールです。それを使用してください。

いいえ、それらの関数が非同期であることは必須ではありません。私はあなたのすべての質問がこれで答えられると信じています: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/、ここで重要な点は次のとおりです:

Node.js はコードに対して 1 つのスレッドを保持しますが、コード以外はすべて並列に実行されます。

于 2013-07-14T18:57:50.123 に答える
0

別の方法は、promise (bluebird) を使用することです。ここでドキュメントとサンプルの使用法を参照してくださいhttp://bluebirdjs.com/docs/getting-started.html )。

例えば、

function f1() {... }
function f2() {... }
function f3() {... }

Promise.all[f1(), f2(), f3()] // run all functions parallel
  .then(() => { /*do something*/})
  .catch(err => { /*handle error*/ })
于 2016-06-20T10:44:08.137 に答える