マルチスレッドに代わるNode JSの把握


142

私が正しく理解していれば、Node JSは非ブロッキングです...データベースまたは他のプロセスからの応答を待つ代わりに、何か他のノードに移動し、後でチェックします。

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

つまり、これはすべて、特定のNode JSプロセスが単一のCPUコアを完全かつ効率的に利用できることを意味しますが、マシン上の他のコアを使用しないため、一度に複数のコアを使用することはありません。

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

また、Node JSプロセスにエンドレスループまたは長時間実行機能がある場合、エンドレスループまたは長時間実行機能が停止する(またはプロセス全体が終了する)まで、そのプロセスはまったく役に立たなくなります。

大丈夫ですか?私の理解は正しいですか?


2
「ノード」はシングルスレッドではありません。JS / V8エンジンのみがシングルスレッドで実行されます。NodeJSのlibuv部分はマルチスレッドです。参照されNodeJS本当にシングルスレッド?
RaelB 2016

回答:


87

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

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

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


2
私はまだNode.jsに不慣れで、ここでの議論に感謝します。非ブロッキング呼び出しがスレッド化されたブロッキング呼び出しによって裏付けられるという仮定を立てることはおそらく賢明ではないことを指摘したいだけです(@jcoderがこれらの仮定に基づいてコードを設計することを提案したわけではありません)。この場合、IOがブロッキング呼び出しのある別のスレッドで処理されても、そのスレッドは基本的にIOで待機するため、他のコア/ CPUを使用しません。使用しているツールの強さに合わせてコーディングし、低レベルの詳細についてはあまり問題にしないでください(問題になるまで)。
wbyoung 14

フロントエンドでjavascriptコードのようなコールバックを使用して他のプロセスを実行できるように
yussan

37

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

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


記事は誤りです。マルチスレッドのapache mpmは存在しますが、日常的に使用されるほとんどすべての構成と互換性がありません。Apacheはマルチプロセスであり、今までマルチスレッド化されていません。私はそれがカタストロファールであると思います、専門用語の適切な意味を操作することは問題を隠す代わりにそれを解決するための良い試みだけです。
peterh-モニカを2017年

1
@peterh意味がわかりません。記事は完全に正しく、Apacheは構成に応じてマルチプロセスまたはマルチスレッドであると述べています。マルチプロセスの場合は、多くの接続の処理に関してさらに悪化します。これが、Apacheが最初に言及された唯一の理由です。さらに、非常に一般的に使用されているPHPモジュールは、すべて独自にマルチスレッド化されています。そして最後に、私はApacheの専門家ではありませんが、他の記事からの私の印象は、ワーカーMPMが実際に非常に一般的に使用されているということです。
Michael Borgwardt 2017

@MichaelBorgwardtはい、Apacheはマルチスレッド化でき、マルチプロセスも可能です。私はそれを否定しませんでした。しかし、phpはマルチプロセス構成と互換性がなく、Apacheの専門家であれば、きっとそれを知っているでしょう。非常に一般的に使用されるphpモジュールはマルチスレッド化されていません。あなたの情報は間違っています。テスト構成を試すことをお勧めします。それは議論の問題ではなく、事実に基づくものです。試してみてください。
peterh-モニカを2017年

27

これが古いスレッドであっても、Node.JSアプリでその1つ以上のコアをどのように利用するかというアイデアと共有したいと思いました。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()

もちろん、タスクで実行できることは他にもあります。ドキュメントはこちらです。

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



1

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

ここをクリックしてビデオをご覧ください

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


2
これはコメントである必要があります
Cherniv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.