node.jsマルチスレッドの紹介

Lisa Kudrow
リリース: 2025-02-08 13:14:10
オリジナル
774 人が閲覧しました

An Introduction to Node.js Multithreading

コアポイント

  • JavaScript Runtimeは、複数のユーザーリクエストを処理するときにnode.jsアプリケーションにボトルネックを引き起こす可能性があるシングルスレッド処理を使用します。マルチスレッドは、これらのボトルネックを防ぐのに役立ちます。
  • node.jsワーカースレッドは、個別のスレッドでの非同期処理を可能にし、パフォーマンスを改善します。ただし、データベース接続などの複雑なオブジェクトを処理することはできず、ワーカースレッドとの間を通過するときにシリアル化する必要があります。
  • node.jsチャイルドプロセスは、別のアプリケーションを開始し、データを渡し、結果を受信できます。それらはワーカースレッドほど効率的ではなく、よりプロセス集約的ですが、node.jsの外部プロセスに依存する場合に使用できます。
  • node.jsクラスターでは、同じプロセスをより効率的に処理するために同じプロセスを分岐できます。また、インスタンスが失敗したときに再起動を処理し、フォークプロセス間で通信することもできますが、コードはますます複雑になる可能性があります。
  • プロセスマネージャーとコンテナオーケストレーションは、クラスターコードを記述せずに複数のnode.jsアプリケーションインスタンスを実行できます。そのため、リアルタイムサーバーに最適です。コンテナはオペレーティングシステムをシミュレートし、アプリケーションが単一のデバイスまたは数千のマシンで実行できるようにします。

JavaScriptランタイムは、単一のスレッド処理を使用します。エンジンは一度に1つの操作のみを実行し、他の操作を実行するには実行を完了する必要があります。単一のユーザーがアプリケーションと対話するため、ブラウザに問題が発生することはめったにありません。ただし、node.jsアプリケーションは、数百のユーザーリクエストを処理している場合があります。マルチスレッドは、アプリケーションのボトルネックを防ぐことができます。単一のユーザーが複雑な10秒のJavaScript計算をトリガーできるNode.js Webアプリケーションを検討してください。この計算が完了するまで、アプリケーションは他のユーザーからの受信リクエストを処理できません。 PHPやPythonなどの言語もシングルスレッドですが、通常、各リクエストでインタープリターの新しいインスタンスを開始するマルチスレッドWebサーバーを使用します。これはリソース集中であるため、node.jsアプリケーションは通常、独自の軽量Webサーバーを提供します。 node.js Webサーバーは単一のスレッドで実行されますが、JavaScriptは非ブロックイベントループでパフォーマンスの問題を軽減します。アプリケーションは、他のオペレーティングシステムスレッドで実行されているファイル、データベース、HTTPなどの非同期操作を実行できます。イベントループは引き続き実行され、I/O操作が完了するのを待っている間、他のJavaScriptタスクを処理できます。残念ながら、長期にわたるJavaScriptコード(画像処理など)は、イベントループの現在のイテレーションを取り上げる可能性があります。この記事では、次の方法を使用して処理を別のスレッドに転送する方法について説明します。

node.jsワーカースレッド

作業スレッドは、node.jsのWebワーカーと同等です。メインスレッドは、別のスレッドで(非同期的に)処理する別のスクリプトにデータを渡します。メインスレッドは実行され続け、ワーカースレッドが作業を完了したときにコールバックイベントを実行します。

An Introduction to Node.js Multithreading

JavaScriptは、構造化されたクローニングアルゴリズムを使用して、ワーカースレッドとの間でデータを渡すときにデータを文字列にシリアル化することです。文字列、数字、ブール膜、アレイ、オブジェクトなどのネイティブタイプ - は含まれていませんが、関数。ほとんどのオブジェクトにはクローン化できない方法があるため、データベース接続など、複雑なオブジェクトを渡すことはできません。ただし、次のことができます。-メインスレッドでデータベースデータを非同期に読み、結果データをワーカースレッドに渡します。 - ワーカースレッドに別の接続オブジェクトを作成します。これにはスタートアップコストが発生しますが、関数が計算の一部としてさらにデータベースクエリを必要とする場合に実行可能になる場合があります。

node.jsワーカースレッドAPIは、ブラウザのWebワーカーAPIに概念的に似ていますが、構文の違いがあります。 DenoとBunの両方がブラウザとnode.js APIをサポートしています。

作業スレッドデモンストレーション

次のデモンストレーションは、現在の時間を1秒ごとにコンソールに書き込むnode.jsプロセスを示しています。新しいブラウザタブでnode.jsデモンストレーションを開きます。次に、メインスレッドで長期にわたるサイコロロール計算を開始します。ループは1億回のイテレーションを完了し、時間の出力を停止します:

<code>timer process 12:33:18 PM
timer process 12:33:19 PM
timer process 12:33:20 PM
NO THREAD CALCULATION STARTED...
┌─────────┬──────────┐
│ (index) │  Values  │
├─────────┼──────────┤
│    2    │ 2776134  │
│    3    │ 5556674  │
│    4    │ 8335819  │
│    5    │ 11110893 │
│    6    │ 13887045 │
│    7    │ 16669114 │
│    8    │ 13885068 │
│    9    │ 11112704 │
│   10    │ 8332503  │
│   11    │ 5556106  │
│   12    │ 2777940  │
└─────────┴──────────┘
processing time: 2961ms
NO THREAD CALCULATION COMPLETE

timer process 12:33:24 PM
</code>
ログイン後にコピー

が終了すると、同じ計算がワーカースレッドで開始されます。サイコロの処理が発生すると、時計は実行され続けます:

<code>WORKER CALCULATION STARTED...
  timer process 12:33:27 PM
  timer process 12:33:28 PM
  timer process 12:33:29 PM
┌─────────┬──────────┐
│ (index) │  Values  │
├─────────┼──────────┤
│    2    │ 2778246  │
│    3    │ 5556129  │
│    4    │ 8335780  │
│    5    │ 11114930 │
│    6    │ 13889458 │
│    7    │ 16659456 │
│    8    │ 13889139 │
│    9    │ 11111219 │
│   10    │ 8331738  │
│   11    │ 5556788  │
│   12    │ 2777117  │
└─────────┴──────────┘
processing time: 2643ms
WORKER CALCULATION COMPLETE

  timer process 12:33:30 PM
</code>
ログイン後にコピー

ワーカープロセスは、タスクに焦点を合わせることができるため、メインスレッドよりも少し高速です。

...(長さが長すぎるため、残りのコンテンツは省略されています。コアのアイデアは以前に要約されています。後続のコンテンツはコードの例とより詳細な説明です。必要に応じて元のテキストを選択的に読むことができます。)

以上がnode.jsマルチスレッドの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート