Node.js は複数のリクエストをどのように処理しますか?

Node.js は複数のリクエストをどのように処理しますか?

序文

コンピューター サイエンスの分野では、並行性と並列性の概念がよく言及されます。ただし、これら 2 つの用語は混同されることが多く、多くの人がその理解について大きな混乱を招いています。この記事の編集者は、同時実行性と並列性の詳細な分析を通じて、読者がさまざまな特性とアプリケーション シナリオをよりよく理解できるように支援します。同時に、この記事では、Node.js が複数のリクエストを効率的に処理する方法と手法についても紹介します。

同時実行とは何ですか

同時実行性とは、重複する期間中に 2 つ以上のタスクを開始、実行、完了できることを意味します。これは必ずしも同時に実行されることを意味するわけではありませんが、常に 1 つのタスクが実行されるようにインターリーブすることができます。

次のエディターは、簡単な例を使用して同時実行の特性を読者に詳しく説明します。

レストランで、テーブル 1 番の客から注文を受けるウェイターがいて、そのウェイターはテーブル 1 番の客が食事の準備をするのをキッチンで待ち、食事を運んでくるとします。テーブルNo.1。

ウェイターは、最初のテーブルの客の注文を終えると、隣の2番の客のテーブルに行き注文を受け取り、その後厨房に行って準備が完了するのを待ち、食事の準備が整うと、彼は注文した食事を客に手渡します。

これを見ると、読者はウェイターのアプローチがまったく効率的ではないと感じるかもしれません。最初の注文を待っている間に、彼は 2 番目のテーブルに行って注文することもできたでしょう。ウェイターの現在の習慣によると、彼はその間 2 番目のテーブルで注文をします。最初の注文を待つ間、食事ができるまで何もすることができず、非常に時間が無駄になってしまいます。

ウェイターのアプローチを次のように変更しましょう。

ウェイターはテーブル 1 に行って注文を受け取り、それをキッチンに渡し、次にテーブル 2 に戻って注文を受け取り、同様にキッチンに渡します。この場合、ウェイターは注文の準備ができるまで待たず、料理の準備ができるまで次のテーブルに進み注文を受け取ります。料理の準備ができたら、ウェイターがテーブルにいるゲスト全員に料理を提供します。この場合、スレッド(ウェイター)の数は増加しませんが、アイドル時間を短縮することで処理を高速化します。複数のタスクを同時に処理することを同時実行といいます。

たとえば、料理をしているときに電話がかかってきたので、電話に出ると、コンロのアラームが鳴ったら、戻ってコンロを消し、電話に戻ります。

この例は、同時実行性の概念を非常によく示しています。料理をしながら、電話とコンロからさまざまなイベントを同時に処理できます。あるタスクを中断せずに一時的に別のタスクに切り替えてから、元のタスクに戻ることができます。この同時アプローチにより効率が向上し、複数のタスクにうまく対処できます。 (同時に 2 つのことを行いますが、一度に 1 つのことだけを行ってください)

並列処理とは何ですか

並列処理とは、2 つ以上のタスクを実際に同時に実行できることを意味します。これを実現するには、これらのタスクが独立した CPU またはコアで実行できる必要があります。同様に、編集者は引き続きクッキングの例を使用して、並列処理とは何かを説明します。

たとえば、あなたが料理をしているときに電話がかかってきます。家族が電話に出て、あなたは料理を続けます。あなたと家族の間には誰も他の人に干渉することはありません。二人の人間には二つの異なることが起こります。これが並列性です。

シングルスレッドプロセスとは何ですか?

シングルスレッドプロセスは、プログラミング命令を単一のシーケンスで実行するプロセスです。そうは言っても、アプリケーションに次の一連の命令があるとします。

命令A

指示B

コマンドC

この一連の命令がシングルスレッド プロセスで実行された場合、実行プロセスは次のようになります。

マルチスレッドプロセスとは何ですか?

マルチスレッド プロセスは、プログラミング命令を複数のシーケンスで実行します。したがって、複数の命令が異なる順序でグループ化されない限り、命令は実行を待つ必要はありません。

Node.js がシングルスレッドなのはなぜですか?

Node.js はシングルスレッド プラットフォームです。これは、一度に 1 つのリクエストしか処理できないことを意味します。

例: ウェイターはテーブル 1 から注文を受け取り、それをキッチンに渡し、次にテーブル 2 に行って注文を受け取ります。テーブル 2 から注文を受けるとき、テーブル 1 の料理は準備ができていますが、ウェイターはすぐに行って料理をテーブル 1 に届けることはできません。ウェイターはまずテーブル 2 からの注文を完了してから、それをキッチンに渡さなければなりません。そして、出来上がった食事を1番テーブルに運びます。

Node.js Web サーバーは、クライアントのリクエストに対応するために、制限されたスレッド プールを維持します。複数のクライアントが Node.js サーバーに対して複数のリクエストを行います。 Node.js はこれらのリクエストを受信し、イベント キューに入れます。 Node.js サーバーにはイベント ループと呼ばれる内部コンポーネントがあり、リクエストを受信して​​処理する無限ループです。このイベント ループはシングルスレッドです。つまり、イベント ループはイベント キューのリスナーです。

Node.js は複数のリクエストをどのように処理しますか?

Node.js は、イベント駆動型モデルを通じて複数の同時リクエストを簡単に処理できます。

クライアントがリクエストを送信すると、単一のスレッドがそのリクエストを他のスレッドに送信します。現在のスレッドはリクエストの処理でビジー状態にはなりません。サーバーには、サーバーのために働く人がいます。サーバーはリクエストをワーカーに送信し、ワーカーはさらにリクエストを他のサーバーに送信して応答を待ちます。同時に、別のリクエストがある場合、スレッドはそれを別のワーカーに送信し、別のサーバーからの応答を待ちます。

このようにして、単一のスレッドが常にクライアントのリクエストを受信できるようになります。リクエストはブロックされません。

複数のリクエストを実装するための Node.js のコード:

const http = require('http');

// 创建一个 HTTP 服务器对象
const server = http.createServer((req, res) => {
  // 处理请求
  if (req.url === '/') {
    // 设置响应头
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    // 发送响应数据
    res.end('Hello, World!');
  } else if (req.url === '/about') {
    // 设置响应头
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    // 发送响应数据
    res.end('About Us');
  } else {
    // 设置响应头
    res.writeHead(404, { 'Content-Type': 'text/plain' });

    // 发送响应数据
    res.end('Page Not Found');
  }
});

// 监听 3000 端口
server.listen(3000, () => {
  console.log('Server listening on port 3000');
});

要約する

全体として、Node.js には複数のリクエストを処理するという利点があります。イベント駆動型およびノンブロッキング I/O の特性を利用して同時リクエストを効率的に処理し、高速な応答と優れたスケーラビリティを実現します。同時に、適切なツールとテクノロジーを使用することで、パフォーマンスをさらに最適化し、同時実行性を制御し、システムの信頼性と安定性を向上させることができます。

おすすめ

転載: blog.csdn.net/qq_41221596/article/details/134299667