成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

聊聊Node.js + worker_threads如何實現多線程?(詳解)

本篇文章帶大家了解一下worker_threads 模塊,介紹一下在Node中如何使用worker_threads實現多線程,以及利用worker_threads執行斐波那契數列作為實踐例子,希望對大家有所幫助!

聊聊Node.js + 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_processcluster 不同,worker_threads 可以共享內存。 它們通過傳輸 ArrayBuffer 實例或共享 SharedArrayBuffer 實例來實現。

由于以下特性,worker_threads已被證明是充分利用CPU性能的最佳解決方案:

  • 它們運行具有多個線程的單個進程。

  • 每個線程執行一個事件循環。

  • 每個線程運行單個 JS 引擎實例。

  • 每個線程執行單個 Nodejs 實例。

worker_threads 如何工作

worker_threads通過執行主線程指定的腳本文件來工作。每個線程都在與其他線程隔離的情況下執行。但是,這些線程可以通過消息通道來回傳遞消息。

主線程使用worker.postMessage()函數使用消息通道,而工作線程使用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)); }

上述代碼主線程工作線程都使用同一份文件作為執行腳本(__filename為當前執行文件路徑),通過isMainThread來區分主線程工作線程運行時邏輯。當模塊對外暴露方法parseJSAsync被調用時候,都將會衍生子工作線程去執行調用parse函數。

worker_threads 具體使用

在本節使用具體例子介紹worker_threads的使用

創建工作線程腳本文件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 密集型示例,生成斐波那契數列。

如果在沒有工作線程的情況下完成此任務,則會隨著nth期限的增加而阻塞主線程。

創建工作線程腳本文件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

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
无码专区天天躁天天躁在线| 压在稚嫩的身体上耕耘| 少妇人妻互换不带套| 无码人妻精品一区二区蜜桃网站| 性欧美ⅩXX1819内谢| 亚洲精品久久久久无码AV片软件| 野花高清在线观看免费| 99RE免费99RE在线视频| JAVAPARSER少妇高潮| 懂色av 春色 色欲| 国产小伙和50岁熟女59P| 久久精品噜噜噜成人AV| 男同GAY片自慰AV网站| 日本熟妇极品FREE| 西方14147大但人文艺术| 亚洲欧美国产免费综合视频| 18禁H免费动漫无码网站| 成人av在线播放| 少妇爆乳无码AV专区网站寝取| 四川小少妇BBAABBAA| 亚洲AV无码专区在线观看成人| 一边喘气一边说疼的视频| EEUSS鲁片一区二区三区| 成熟交BGMBGMBGM图片| 国产综合无码一区二区色蜜蜜| 久久伊人精品一区二区三区| 人妻有码中文字幕在线| 午夜理论片免费播放| 野花韩国高清免费视频6| АⅤ天堂中文在线网| 国产乱子伦精品无码码专区| 久久久亚洲欧洲日产国码二区| 人妻丰满熟AV无码区HD| 校园H学长含着粉嫩小奶| 幼儿HIPHOP仙踪林的功能| 成人免费一区二区三区视频| 激情97综合亚洲色婷婷五| 欧美XXXX做受欧美88BBW| 无码人妻一区二区三区免费看成人 | 亚洲AV无码成人精品区天堂| 18禁爆乳无遮挡免费观看日本动| 国产成人精品视频ⅤA秋霞影院| 久久久久久精品免费免费R| 人与畜禽共性关系的重要性有哪些 | 日本熟妇JAPANESE丰满| 亚洲韩国精品无码一区二区| 啊别插了视频高清在线观看| 火柴人战争遗产破解版| 任你躁久久精品6| 亚洲人成人无码www五月婷| 苍井空浴缸大战猛男120分钟| 精品国产一区二区三区久久久狼| 人妻波多野结衣爽到喷水| 亚洲AV无码一区东京热久久| А√天堂资源最新版在线官网 | 成人无码免费一区二区三区 | 亚洲色欲色欱WWW在线| 吃奶呻吟打开双腿做受在线视频| 久久精品成人无码观看免费| 日日摸日日碰人妻无码老牲| 在线观看WWW成人片| 国产剧情MV天美传媒| 欧美性受XXXX88喷潮| 亚洲精品无码久久久| 儿子比老公更大更硬朗| 狂躁美女大BBBBBB视频U| 午夜男女爽爽羞羞影院在线观看| 97久久精品亚洲中文字幕无码| 国语自产精品视频在线区| 日本乱熟人妻精品乱码涩爱| 亚洲熟妇色ⅩXXXX日本| 国产JJIZZ女人多水喷水| 女性高爱潮免费有声视频网站 | 久久AV无码精品人妻出轨| 双飞两个丰满少妇11P| 2023国精产品一二三四区| 激情内射日本一区二区三区| 天天摸天天碰天天添中文无码| 99精品国产兔费观看久久| 久久精品国产99精品国产202| 无码欧亚熟妇人妻AV在线| ているの天堂资源WWW| 久久亚洲国产精品123区| 亚洲AV无码码潮喷在线观看| 丰满岳乱妇在线观看中字| 欧美精品做受XXX性少妇| 野花社区WWW高清图片| 国内精品乱码卡一卡2卡麻豆| 兽交ZOOSKOO| 八戒八戒神马影院在线4| 免费网站看V片在线18禁无码| 亚洲精品AⅤ在线观看| 国产极品视觉盛宴专区| 日韩AV无码一区二区三区| 99国产精品久久久久久久成人热| 久久精品夜色国产亚洲AV| 亚洲AV永久天码精品天堂DL| 国产精品美女久久久网站动漫| 日韩VA中文字幕无码电影| JAPANESEⅩⅩⅩHD69| 蜜桃AV无码乱码精品| 野花香视频在线观看免费高清版| 护士猛少妇色XXⅩXXX猛叫| 无码午夜福利片在线观看 | CHINESE老女人老熟妇HD| 老头猛挺进小雯的体内视频| 亚洲性无码AV中文字幕| 娇妻强被迫伦姧惨叫 在线| 羞涩的丰满人妻40P| 国产精品美女久久久浪潮AV| 天堂AV旡码AV毛片毛片免费| 大香伊蕉在人线国产2020年| 日本久久久WWW成人免费毛片丨| JEALOUSVUE成熟少归| 欧美狂野乱码一二三四区| 最新版天堂中文在线官网| 蜜臀AV无码一区二区三区小说| 余生请多指教在线观看免费全集 | 极品少妇被啪到呻吟喷水| 学生妹亚洲一区二区| 国产精品一国产精品| 无码专区一ⅤA亚洲V天堂| 国产精品乱码一区二区三| 我故意没有穿内裤坐公车让| 国产成人愉拍精品| 无码国产精品一区二区免费久久| 国产成人无码AV一区二区在线观| 天堂АⅤ在线最新版在线| 国产成人午夜福利院| 特大巨黑吊性XXXX| 国产精品国产三级国产专I| 无码一区二区三区AV免费| 国产色无码精品视频免费| 亚洲AV午夜成人片忘忧草在线| 黑人又大又粗猛裂进出视频| 亚洲毛片无码专区亚洲乱| 久久久无码精品国产一区| 在线精品亚洲一区二区绿巨人| 男人J桶进女人P无遮挡在线观看 | 日本无人区码卡二卡三卡| 德国FREE性VIDEO极品 | 国产乱码精品一区三上| 亚洲AV无码成人精品区浪潮AV | 国产精品无码A∨精品影院APP| 无码人妻一区二区三区免费看 | 国产★浪潮AV无码性色| 无码少妇丰满熟妇一区二区| 韩国女星潜规39集无删减| 亚洲日本中文字幕乱码在线电影| 久久青草费线频观看| 97国语精品自产拍在线观看一| 人伦亲情父母儿女的句子简短| 处破痛哭A√18成年片免费| 无码精品毛片波多野结衣| 皇帝在御花园进入贵妃的小说| 一对浑圆的胸乳被揉捏| 欧美成人片在线观看网站| 大香煮伊在2020一二三久| 无人区一码一码二码三码区别 | 亚洲性色AV日韩在线观看| 免费无码又爽又刺激高潮| 被粗大噗嗤噗嗤进出灌满浓浆| 天堂中文在线最新版地址| 激情内射亚州一区二区三区爱妻| 夜夜高潮次次欢爽AⅤ女| 欧美一级 片内射黑人i| 给丰满丁字裤少妇按摩到高潮| 亚洲AV无码XXX麻豆艾秋| 久久先锋男人AV资源网站 | 中日AV高清字幕版在线观看 | 国产AV午夜精品一区二区入口| 亚洲成AV人片一区二区密柚| 免费A级毛片无码免费视频APP| 成人国产一区二区三区| 亚洲AV实录无码成人精品电影| 久久久久人妻一区精品色| 拔萝卜高清视频大全免费观看| 无码人妻精品一区二区桃蜜| 久久无码高潮喷水免费看| 成人精品一区二区三区中文字幕| 亚洲AⅤ在线无码播放毛片一线天| 久久亚洲精品综合国产仙踪林| 变态拳头交视频一区二区| 亚洲 欧美 中文 日韩AⅤ手机| 麻豆精品一区二区综合AV | 无码日韩精品一区二区三区免费 | 国内精品国产成人国产三级| 综合 欧美 小说 另类 图| 天堂资源中文WWW| 旧里番YY6080在线播放| 丰满性熟妇ⅩXXOOOZZX| 亚洲无码成人av| 日韩人妻中文无码一区二区 | 人妻中文字幕AV无码专区| 国产情侣一区二区| 3分19秒砍人手脚血腥场面| 无码激情亚洲一区| 免费A级毛片无码樱桃视频| 国产精品久久毛片| 51国产偷自视频区视频|