21

Node.jsでノンブロッキングI/Oを非常に簡単に書くことができます。これは、ライブラリ全体が設定されているものです。

しかし、行われる計算はすべてブロッキングです。イベントエミッタを通過するメッセージはすべてブロックされています。

たとえば、発行イベントはすぐに解決されるため、次のようにブロックされます。

var e = new process.EventEmitter;
e.on("foo", function() {
    console.log("event");
});
process.nextTick(function() {
    console.log("next tick");
});
setTimeout(function() {
    console.log("timeout");
}, 0);
e.emit("foo");

> event
> next tick
> timeout

呼び出しをラップする以外nextTickに、コードを非ブロッキングにするにはどうすればよいですか?

できるだけ多くのクライアントに同時にサービスを提供できるように、イベントループのサイクルごとの計算をできるだけ少なくしたいと思います。

ノンブロッキング方式でコードを書くにはどうすればよいですか?

また、非ブロッキングコードがある場合、それを複数のプロセスにスケーリングするにはどうすればよいですか?

1つのオプションは、WebWorkerサブプロセスAPIが終了するのを待っています。

4

2 に答える 2

9

JavaScriptはシングルスレッドです。つまり、イベント、タイムアウト、またはnextTickによる遅延に関係なく、実行された計算はすべてプロセス全体をブロックします。

process.nextTickUIのブロックを回避するためにクライアント側で行われるように、を使用して処理を段階的に分割するとsetTimeout(fn, 0)、ワークロードをより長い期間に分散して、他の機能を実行するためのスペースを確保できます。

しかし、これは非常に効果のない解決策です。作業の総量は同じであり、すべてのサイクルに分散されます(各要求が少し遅くなります)。実際には、数ミリ秒以上かかると予想されるあらゆる種類の計算は、別のプロセスにオフロードする必要があります。同時実行性を最大化するには、常にできるだけ早くイベントループに戻る必要があります。

child_process.fork()数日前にv0.5に追加されました。子プロセスの作成と通信を簡素化します。WebワーカーAPIではありませんが、閉じます。URLhttps://github.com/joyent/node/blob/master/doc/api/child_process.markdownを参照し ください

于 2011-04-14T23:22:44.447 に答える
1

JavaScriptには実際のマルチスレッドはありません。それが、呼び出しを非ブロッキングにするために必要なことです。私が考えることができるのはWebワーカーだけです:https ://developer.mozilla.org/en/Using_web_workers

于 2011-04-14T22:10:39.597 に答える