1

サーバー側で「on」イベントを受け取ったときに、タスクを並行して開始して、現在のイベント ループ スレッドをブロックしないようにしたいと考えています。そうすることは可能ですか?どのように?

サーバー側のループをブロックしたくありません。タスクが完了したら、次のようなメッセージをクライアントに送り返すことができるようにしたいと考えています。

client.on('execute-parallel-task', function(msg) {
    setTimeout(function() {
        // do something that takes a while
        client.emit('finished-that-task');
    },0);
    // this block should return asap, not waiting for the previous call
});

setTimeout が機能するかどうかはわかりません。

4

2 に答える 2

2

それは時間がかかるものに依存します。非同期に時間がかかり(コールバックまたはcompleteハンドラーを登録する必要があるためわかります)、CPU バウンドではなく IO などでブロックされているために時間がかかる場合は、本質的にparallelになります。

ただし、その何かが同期または CPU バウンドの場合setTimeoutsetImmediateなどを使用してすぐにメッセージを送り返すことができますが、setTimeoutまたはのハンドラーsetImmediateが実行されると、単一の実行スレッドがそれを処理してスタックします。問題を実際に修正しているのではなく、単に延期しているだけです。

真の並列動作を示すには、子プロセスを起動する必要があります。メッセージ パッシング機能を使用して、何をすべきかをワーカーに通知し、作業が完了したら親プロセスに通知することができます。

var cp = require('child_process');
var child = cp.fork(__dirname + '/my-child-worker.js');

n.on('message', function(m) {
  if (m === "done") {
      // Whey!
  }
});

n.send(/* Job id, or something */);

次にmy-child-worker.js;

process.on('message', function (m) {
    switch (m) {
        case 'get-x':
            // blah
        break;
        // other jobs
    }

    process.send('done');
});
于 2013-05-26T21:07:02.530 に答える
1

setTimeout は必要ありません。並列実行タスクが終了すると、関数(msg)が呼び出されます。

非同期で実行するタスクを設計している場合は、node.js の async lib のようなものを見ることができます。

非同期ノード JS リンク

于 2013-05-26T21:03:13.633 に答える