web-dev-qa-db-ja.com

マルチスレッドの代わりにNode JSの代替をつかむ

正しく理解すればNode JSは非ブロッキングです...そのため、データベースまたは他のプロセスからの応答を待つ代わりに、別の場所に移動し、後で確認します。

また、シングルスレッドです。

つまり、特定のNode JSプロセスは単一のCPUコアを完全かつ効率的に使用できますが、マシンで他のコアを使用することはありません。時間。

もちろん、これは、別のプロセスである限り、他のCPUがSQLデータベースや意図的に分離されたCPU負荷の高いサブルーチンなどの他のプロセスで使用できることを意味します。

また、Node JSプロセスにエンドレスループまたは長時間実行機能がある場合、エンドレスループまたは長時間実行機能が停止する(またはプロセス全体が強制終了される)まで、そのプロセスはもはや役に立ちません。

これでよろしいですか?私の理解は正しいですか?

139
Bryan Field

はい、ほぼ正しいです。 node.jsサーバーには内部スレッドプールがあるため、ブロッキング操作を実行し、完了時にコールバックまたはイベントでメインスレッドに通知できます。

だから、スレッドプールの別のコアを限定的に使用することを想像します。たとえば、非ブロッキングファイルシステムの読み取りを行う場合、スレッドプールからスレッドに読み取りを実行してコールバックを設定するように伝えることで実装される可能性がありますつまり、メインのnode.jsプログラムが別の処理を行っている間に、別のスレッド/コアで読み取りが行われる可能性があります。

ただし、node.jsの観点からは、完全にシングルスレッドであり、複数のコアを直接使用することはありません。

86
jcoder

はい、あなたの理解は完全に正しいと思います。 この記事アーカイブ済み )は、この設計の根拠を非常によく説明しています。これはおそらく最も重要な段落です。

Apacheはマルチスレッドです。リクエストごとにスレッドを生成します(またはプロセス、confに依存します)。同時接続の数が増え、複数の同時クライアントにサービスを提供するためにより多くのスレッドが必要になると、そのオーバーヘッドがどのようにメモリを消費するかを確認できます。 NginxとNode.jsはマルチスレッドではありません。スレッドとプロセスには大きなメモリコストがかかるためです。これらはシングルスレッドですが、イベントベースです。これにより、単一のスレッドで多数の接続を処理することにより、数千のスレッド/プロセスによって発生するオーバーヘッドがなくなります。

36

これが古いスレッドであったとしても、Node.JSアプリで複数のコアをどのように利用するかというアイデアを共有すると思いました。 Nuray Altinが言及したように、- JXcore はそれを行うことができます。

簡単な例:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

デフォルトでは2つのスレッドがあります( jxcore.tasks.setThreadCount() で変更できます)

もちろん、タスクでできることは他にもたくさんあります。ドキュメントは here です。

その主題に関するいくつかの記事:

26
infografnet

この質問はほぼ2年前に尋ねられたので。 Node.JSのマルチスレッドの問題には、状況が変わってきているか、代替アプローチがあります

以下のブログ投稿によると、着信する「タスク」拡張機能を使用すると、他の利用可能なコアから直接利益を得ることができます。

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

13
Nuray Altin

Node.jsはシングルスレッドアプリケーションですが、イベントとコールバックの概念を介して並行性をサポートできます。イベントループがjavascriptでどのように機能するかを説明するPhilip Robertsによるビデオです。

ビデオを見るにはここをクリック

(WebAPIの代わりにNode.jsにC ​​++ APIがあります)

1
Saurabh Lende