ノードを使用すると、このタイプのシナリオで実行できる非常に簡単な最適化があり、それはワーカー プールを作成することです。v8 エンジンの動作方法や、ノードがイベント ループを使用する方法などにより、単一のノード プロセスは、実際にはプロセッサのコアの約 50% しか使用できません。あなたの説明がファイルサーバーに典型的であるように思われる比較的標準的なイベントループ(大量の同期作業ではない)を想定すると(I / Oが多いが、プロセッサの重い操作はほとんどない)、起動することで大幅なパフォーマンスの向上を得ることができます多くのノード ワーカー。これにより、ノード プロセスの 1 つがイベントをリッスンしていない時間が最小限に抑えられ、CPU の作業量が最大化されます。もちろん、これによって個々のトランザクションが高速化されるわけではありません。
https://github.com/isaacs/cluster-master
Cluster-master は、ワーカーを管理し、ワーカー プールを作成するプロセスを安定してシンプルに保つための便利なツールであり、NPM でインストールできると思います。
編集:
何を非同期で実行できるか、何を同期で実行する必要があるかは、常に簡単に判断できるとは限りません。注意すべき事項の経験則:
名前に同期を含むノード/ライブラリ呼び出し...
他の関数への呼び出しがほとんどない大規模な関数。
ビジーな while ループ
いくつかの代替案:
回避できないビジーな while ループがある場合。少なくともイベント ループ時間が新しいイベントを取得できるようにするために、いくつかのクールなロジックを実行できます。これはおそらく有効なコードではありません (ノードを備えた PC ではありません) が、概念のデモを行う必要があります。
var someInt;
function callBack() {
doWorkWith(someInt);
someInt++;
if(someInt < someMaximum) event.trigger(whileLoop);//The entire event loop will be able to run before we get to the next iteration of callback because we're using events!
}
event.register(whileLoop, callBack);
ノードにイベントを登録するためのコードを覚えていませんが、このロジックは、while ループが必要な場合に適しています。これにより、各反復でイベント ループ全体を実行できるため、次のようになります。
while(someInt++ < someMax) {
doWorkWith(someInt);
}
while ループの実行中は、他のイベントを取得できません。
もう 1 つ注意すべきことは、ライブラリ プログラマ、特に I/O ライブラリの悪い習慣です。コードを調べる機会があった場合や、ライブラリに関する非常に肯定的なレビューがない限り、行ったライブラリ呼び出しについて悪いことを想定し、それらが問題の原因であるかどうかを調査してください。