ホームページ >ウェブフロントエンド >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ワーカーと同等です。メインスレッドは、別のスレッドで(非同期的に)処理する別のスクリプトにデータを渡します。メインスレッドは実行され続け、ワーカースレッドが作業を完了したときにコールバックイベントを実行します。
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 サイトの他の関連記事を参照してください。