この記事では、worker_threads モジュールを理解し、worker_threads を使用して Node でマルチスレッドを実装する方法を紹介し、worker_threads を使用して実際の例としてフィボナッチ数列を実行する方法を説明します。皆さんのお役に立ちますように。
通常、Node.js
はシングルスレッドとみなされます。メインスレッドはコーディングシーケンスに従ってプログラムコードを段階的に実行しますが、同期コードがブロックされるとメインスレッドが占有され、それ以降のプログラムコードの実行が停止します。そうです、Node.js
のシングル スレッドは、メイン スレッドが「シングル スレッド」であることを指します。
単一スレッドによって引き起こされる問題を解決するために、この記事の主人公である worker_threads
が登場します。 worker_threads
は、Node.js v10.5.0
の実験的な機能として初めて登場しました。これを使用するには、コマンド ラインで --experimental-worker
を指定する必要があります。 v12.11.0
安定バージョンまで正式に使用されません。
この記事では、worker_threads
の使い方と、worker_threads
を使ってフィボナッチ数列を実行する方法を実践例として紹介します。
前提条件
この記事を読んで利用するには、次のものが必要です:
- インストール済み
Node.js v12.11.0
以降のバージョン - #JavaScript 同期および非同期プログラミングの基本知識をマスターする
- Node.js の動作原理をマスターする
worker_threads の概要
worker_threads
このモジュールでは、JavaScript を並列実行するスレッドの使用が可能になります。
ワーカー スレッドは、CPU を集中的に使用する JavaScript 操作を実行する場合に役立ちます。これらは、I/O 集中型の作業にはあまり役に立ちません。 Node.js の組み込みの非同期 I/O 操作は、ワーカー スレッドよりも効率的です。
child_process
や cluster
とは異なり、worker_threads
はメモリを共有できます。これは、ArrayBuffer
インスタンスを転送するか、SharedArrayBuffer
インスタンスを共有することによって行われます。
worker_threads
は、次の特性により、CPU パフォーマンスを最大限に活用するための最良のソリューションであることが証明されています。
これらは、単一の複数のスレッドで実行されます。プロセス。
各スレッドはイベント ループを実行します。
JS エンジンのインスタンスをスレッドごとに 1 つ実行します。
各スレッドは単一の Nodejs インスタンスを実行します。
worker_threads の仕組み
worker_threads
メインスレッド
指定された スクリプトを実行することにより
をファイルして作業します。各スレッドは他のスレッドから独立して実行されます。ただし、これらのスレッドはメッセージ チャネルを通じてメッセージをやり取りできます。
メイン スレッド
Use worker.postMessage()
関数はメッセージ チャネルを使用し、Worker thread
は parentPort.postMessage() を使用します。 # ##関数。
公式サンプル コードを通じて理解を深めます:
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }上記のコード
メイン スレッドと
Worker thread実行スクリプトと同じファイルを使用し(
__filenameは現在の実行ファイルのパス)、
isMainThreadを使用して
メインスレッドと##を区別します。 #ワーカー スレッド
ランタイム ロジック。モジュールの外部公開メソッド parseJSAsync
が呼び出されると、サブワーカー スレッドが生成され、parse
関数が実行されます。
このセクションでは、具体的な例を使用して、
worker_threadsCreate ## の使用法を紹介します。 #ワーカー スレッド
workerExample.js:
const { workerData, parentPort } = require('worker_threads') parentPort.postMessage({ welcome: workerData })
作成
メイン スレッドスクリプト ファイルmain.js:
const { Worker } = require('worker_threads') const runWorker = (workerData) => { return new Promise((resolve, reject) => { // 引入 workerExample.js `工作线程`脚本文件 const worker = new Worker('./workerExample.js', { workerData }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`stopped with ${code} exit code`)); }) }) } const main = async () => { const result = await runWorker('hello worker threads') console.log(result); } main().catch(err => console.error(err))
台湾のコマンド ライン実行の制御:
node main.js出力:
{ welcome: 'hello worker threads' }
worker_threads フィボナッチ数列演算
このセクションでは、次のことを見てみましょう。 CPU 集中型の例では、フィボナッチ数列
を生成します。 の期限が長くなるにつれてメイン スレッドがブロックされます。作成
ワーカー スレッド
worker.js
const {parentPort, workerData} = require("worker_threads"); parentPort.postMessage(getFibonacciNumber(workerData.num)) function getFibonacciNumber(num) { if (num === 0) { return 0; } else if (num === 1) { return 1; } else { return getFibonacciNumber(num - 1) + getFibonacciNumber(num - 2); } }
作成
メイン スレッドスクリプト ファイルmain.js :
const {Worker} = require("worker_threads"); let number = 30; const worker = new Worker("./worker.js", {workerData: {num: number}}); worker.once("message", result => { console.log(`${number}th Fibonacci Result: ${result}`); }); worker.on("error", error => { console.log(error); }); worker.on("exit", exitCode => { console.log(`It exited with code ${exitCode}`); }) console.log("Execution in main thread");
コンソール コマンド ライン実行:
node main.js出力:
Execution in main thread 30th Fibonacci Result: 832040 It exited with code 0
main.js
ファイルで、クラスから開始します。前の例で見たように、インスタンスはワーカー スレッドWorker を作成します。
結果を取得するために、3 つのイベントをリッスンします。
-
message
响应工作线程
发出消息。 -
exit
在工作线程
停止执行的情况下触发的事件。 -
error
发生错误时触发。
我们在最后一行main.js
,
console.log("Execution in main thread");
通过控制台的输出可得,主线程
并没有被斐波那契数列运算执行而阻塞。
因此,只要在工作线程
中处理 CPU 密集型任务,我们就可以继续处理其他任务而不必担心阻塞主线程。
结论
Node.js
在处理 CPU 密集型任务时一直因其性能而受到批评。通过有效地解决这些缺点,工作线程的引入提高了 Node.js 的功能。
有关worker_threads
的更多信息,请在此处访问其官方文档。
思考
文章结束前留下思考,后续会在评论区做补充,欢迎一起讨论。
-
worker_threads
线程空闲时候会被回收吗? -
worker_threads
共享内存如何使用? - 既然说到
线程
,那么应该有线程池
?
更多node相关知识,请访问:nodejs 教程!
以上がNode.js + worker_threads がマルチスレッドを実装する方法について話しましょう。 (詳しい説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
