nodejs はマルチスレッドではなくシングルスレッドです。nodejs はシングルスレッドの非同期ノンブロッキング モードを使用します。JavaScript エンジンのため、nodejs アプリケーションはマルチコア リソースを利用できません。イベント駆動型の非同期「I/O」メソッドを使用して、シングルスレッドの同時実行性の高いランタイム環境を実現します。
この記事の動作環境: Windows 10 システム、nodejs バージョン 12.19.0、Dell G3 コンピューター。
ノードはシングルスレッドであり、シングルスレッドの非同期ノンブロッキング モードを使用します。
JavaScript エンジンのため、node はデフォルトでシングルスレッドであり、node.js アプリケーションはマルチコア リソースを利用できません。
Node.js はイベント駆動型の非同期 I/O を使用して、シングルスレッドの同時実行性の高いランタイム環境を実装します。シングル スレッドとは、同時に実行できる処理が 1 つだけであることを意味します。
Nodejs は非同期およびノンブロッキングを実装します。
nodejs では、実際には js の実行のみがシングルスレッドであり、I/O は明らかに他のスレッドです。
js 実行スレッドはシングルスレッドであり、必要な I/O が libuv に渡される限り、すぐに戻って他の処理を実行し、指定された時刻に libuv がコールバックします。
具体的には、nodejsはまずnode-bindings内のjsコードからC/Cコードまで呼び出し、その後「リクエストオブジェクト」と呼ばれるものをC/Cコードにカプセル化してlibuvに渡します。 このリクエスト オブジェクトの一部は、実行する必要がある関数コールバックに似ています。libuv へのコールバックを実行し、実行後にコールバックを実装するだけです。
つまり、非同期 I/O の一般的なプロセスは次のとおりです。
1. I/O 呼び出しを開始します
ユーザーは Javascript コードから Node コア モジュールを呼び出し、パラメータとコールバック関数をコア モジュールに渡します。
Node コア モジュールは、渡されたパラメーターとコールバック関数をリクエスト オブジェクトにカプセル化します。
このリクエスト オブジェクトを I/O スレッド プールにプッシュして実行を待ちます。
Javascript の非同期呼び出しが終了し、JavaScript スレッドは後続の操作を実行し続けます。
2. コールバックを実行する
I/O 操作が完了すると、リクエスト オブジェクト内に以前にカプセル化されたコールバック関数が取得され、実行されて、JavaScript コールバックの目的が達成されます。 (ここでのコールバックの詳細は後述します)
ここから、私たちは実際に Node.js の単一スレッドを常に誤解してきたことがわかります。
実際、シングル スレッドは Javascript 実行環境の単一スレッドを指し、Node.js には Javascript の実行時に新しいスレッドを作成する機能がありません。 最終的な実際の操作は引き続き Libuv とそのイベント ループで実行されます。 シングルスレッド言語である Javascript が Node.js で非同期操作を実装できるのはこのためです。 両者は衝突しません。
知識を広げてください:
Node.js マルチスレッドの概要
Node.js はシングルスレッドであるにもかかわらず、周期的なイベント (イベント ループ) を使用して同時実行タスクを実装できるという人もいるかもしれません。その本質を調査すると、NodeJs は実際に 2 つの異なるスレッドを使用します。1 つはループ イベントを処理するためのメイン スレッドで、もう 1 つはワーカー プール内のいくつかの補助スレッドです。これら 2 つのスレッドの主な機能と関係は次のとおりです。
推奨される学習: 「nodejs ビデオ チュートリアル」
上記は、nodejs がマルチスレッドであるかどうかの詳細です。詳細については、このサイトの他の関連記事に注目してください。