Node.jsのイベント駆動型アーキテクチャと他の言語のマルチスレッドプログラミングの違いは何ですか?


答え 1:

イベント駆動型とマルチスレッドパラダイムの両方で、コードはオペレーティングシステムプロセス内で実行されます。

プロセスが複数のスレッドを実行する場合、これらのスレッドは読み取りと書き込みの両方でプロセスメモリ(アドレス空間)を共有します。

Node.jsを強化するJavaScriptは、設計上シングルスレッドです。すべての関数は完了するまで実行されることが保証されており、その関数の実行中に現在のプロセス内の他のJavaScriptコードは実行されません。自然に非同期のイベント(ネットワーク、ディスク入出力、タイマー、その他のハードウェアおよびオペレーティングシステムイベント)は、これらのイベントのハンドラー(またはコールバック)として登録されたJavaScript関数をイベントループキューに追加した後に実行されるエンジンによって処理されますキューの前の機能が終了しました。

マルチスレッドパラダイムでは、2つ以上のスレッドが並行してコードを実行するため、関数の実行中に、異なるプロセッサーコア上で異なるコードが実行され、同じメモリアドレスに対して読み書きが行われる場合があります。これにより、共有メモリへのアクセスを管理するためにコードによって特別なオペレーティングシステムメカニズム(同期プリミティブ)が使用されない限り、メモリの一貫性のない状態になる可能性があります。



答え 2:

これは良い質問です。「Node.jsのイベント駆動型アーキテクチャと他の言語のマルチスレッドプログラミングの違いは何ですか?」

これを少し分解できます。

  • ノードのイベント駆動型アーキテクチャ。

イベント駆動型アーキテクチャはNode専用ではありません(Tornado(Python)、Vertx(Java)、Akka(Scala)、ReactiveX(複数言語))。

  • 他の言語でのマルチスレッドプログラミング。

JavaScriptは設計上、複数のスレッドをサポートしていないことに注意してください。私の知る限り、スレッドとして機能できるウェブワーカーをサポートしていますが。

したがって、イベント駆動型はノードに固有ではなく、ノードでマルチスレッドを実行できます。

そのため、ここで2つの質問があります。「イベント駆動型とマルチスレッドの違い」と「ノードと他の言語(フレームワーク)の違い」です。後者に焦点を当てます。それが質問の意図であると思われるためです。

Nodeを特別なものにしているのは、Webアプリケーションを構築するときにIOのブロックを回避する目的で作成者がNodeを作成したことです。 Nodeコミュニティの文化は、ノンブロッキングIOの強みを強調して構築することです。ブロッキングコールを実行するサードパーティのライブラリをあまり多く見つけることはありません。 Nodeを使用する開発者は、コード内で微妙なブロッキング操作を実行することはほとんどありません。一方、他の言語では、素朴な開発者がデータベース接続からの読み取りなどの非常に非効率的なブロッキング呼び出しを誤って実行する可能性があります。

それ以外は、「並行性」の複数のモデルについて実際に読んで、それぞれの長所と短所を理解する必要があります。マルチスレッドが長い間受け入れられた理由を評価したことに対するボーナスポイント。



答え 3:

概念の違いは簡単に理解できます。

イベント駆動型アーキテクチャでは、プログラムは連続的なシングルスレッドループで実行されます(ノードでいくつかのマルチスレッドを実行できますが、現時点では心配する必要はありません)。イベントが発生すると、ジョブはコールスタックに置かれ、プログラムの余暇に処理されます。

マルチスレッドアーキテクチャは、通常、アクションを待機する必要があるときに新しいスレッドをディスパッチします。したがって、データベースを呼び出して、必要なすべてのことを実行し、必要なことを実行し、元のスレッドを終了または再結合する新しいスレッドをスピンアップします。

これらの方法は両方とも、さまざまなことに非常に役立ちます。イベントドリブンは、新しいイベントがいつ発生し、多くの場合イベントがバーストするかをプログラムが認識しないため、ユーザーインターフェイスとサーバーに最適です。一方、問題をより小さな部分に分割したい(または、単一のスレッドループの限界に近づいている)計算負荷の高いジョブには、スレッド化が必要です。