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

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

聊聊Node.js + worker_threads如何實(shí)現(xiàn)多線程?(詳解)

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

聊聊Node.js + worker_threads如何實(shí)現(xiàn)多線程?(詳解)

通常情況下,Node.js被認(rèn)為是單線程。由主線程去按照編碼順序一步步執(zhí)行程序代碼,一旦遇到同步代碼阻塞,主線程就會被占用,后續(xù)的程序代碼的執(zhí)行都會被卡住。沒錯(cuò)Node.js的單線程指的是主線程是"單線程"。

為了解決單線程帶來的問題,本文的主角worker_threads出現(xiàn)了。worker_threads首次在Node.js v10.5.0作為實(shí)驗(yàn)性功能出現(xiàn),需要命令行帶上--experimental-worker才能使用。直到v12.11.0穩(wěn)定版才能正式使用。

本文將會介紹worker_threads的使用方式,以及利用worker_threads執(zhí)行斐波那契數(shù)列作為實(shí)踐例子。

先決條件

閱讀并食用本文,需要先具備:

  • 安裝了 Node.js v12.11.0 及以上版本
  • 掌握 JavaScript 同步和異步編程的基礎(chǔ)知識
  • 掌握 Node.js 的工作原理

worker_threads 介紹

worker_threads 模塊允許使用并行執(zhí)行 JavaScript 的線程。

工作線程對于執(zhí)行 CPU 密集型的 JavaScript 操作很有用。 它們對 I/O 密集型的工作幫助不大。 Node.js 內(nèi)置的異步 I/O 操作比工作線程更高效。

child_processcluster 不同,worker_threads 可以共享內(nèi)存。 它們通過傳輸 ArrayBuffer 實(shí)例或共享 SharedArrayBuffer 實(shí)例來實(shí)現(xiàn)。

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

  • 它們運(yùn)行具有多個(gè)線程的單個(gè)進(jìn)程。

  • 每個(gè)線程執(zhí)行一個(gè)事件循環(huán)。

  • 每個(gè)線程運(yùn)行單個(gè) JS 引擎實(shí)例。

  • 每個(gè)線程執(zhí)行單個(gè) Nodejs 實(shí)例。

worker_threads 如何工作

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

主線程使用worker.postMessage()函數(shù)使用消息通道,而工作線程使用parentPort.postMessage()函數(shù)。

通過官方示例代碼加強(qiáng)了解:

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)); }

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

worker_threads 具體使用

在本節(jié)使用具體例子介紹worker_threads的使用

創(chuàng)建工作線程腳本文件workerExample.js:

const { workerData, parentPort } = require('worker_threads') parentPort.postMessage({ welcome: workerData })

創(chuàng)建主線程腳本文件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))

控制臺命令行執(zhí)行:

node main.js

輸出:

{ welcome: 'hello worker threads' }

worker_threads 運(yùn)算斐波那契數(shù)列

在本節(jié)中,讓我們看一下 CPU 密集型示例,生成斐波那契數(shù)列。

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

創(chuàng)建工作線程腳本文件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);     } }

創(chuàng)建主線程腳本文件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");

控制臺命令行執(zhí)行:

node main.js

輸出:

Execution in main thread 30th Fibonacci Result: 832040 It exited with code 0

main.js文件中,我們從類的實(shí)例創(chuàng)建一個(gè)工作線程,Worker正如我們在前面的示例中看到的那樣。

為了得到結(jié)果,我們監(jiān)聽 3 個(gè)事件,

  • message響應(yīng)工作線程發(fā)出消息。
  • exit工作線程停止執(zhí)行的情況下觸發(fā)的事件。
  • error發(fā)生錯(cuò)誤時(shí)觸發(fā)。

我們在最后一行main.js,

console.log("Execution in main thread");

通過控制臺的輸出可得,主線程并沒有被斐波那契數(shù)列運(yùn)算執(zhí)行而阻塞。

因此,只要在工作線程中處理 CPU 密集型任務(wù),我們就可以繼續(xù)處理其他任務(wù)而不必?fù)?dān)心阻塞主線程。

結(jié)論

Node.js 在處理 CPU 密集型任務(wù)時(shí)一直因其性能而受到批評。通過有效地解決這些缺點(diǎn),工作線程的引入提高了 Node.js 的功能。

有關(guān)worker_threads

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
波多野成人无码精品电影| 丰满的少妇XXXXX人妻| 黑人狂躁中国人AⅤ| 强CAO出水嗯啊高潮了H漫画| 亚洲国产一区二区三区| 第二书包网高H肉辣文| 老司机午夜精品视频资源| 无码专区中文字幕无码野外| JEALOUSVUE成熟少归| 精品国产一区二区三区色欲| 少妇激情一区二区三区视频| _97夜夜澡人人爽人人喊_欧美 | 日韩产品和欧美产品的区别| 亚洲自偷图片自拍图片| 国产精品嫩草影院永久…| 欧美一级 片内射黑人i| 亚洲一区二区三区乱码AⅤ蜜桃女| 国产9在线 | 欧洲| 欧亚激情偷乱人伦小说专区| 夜夜添无码试看一区二区三区| 国产精品女同一区二区| 人妻插B视频一区二区三区| 野外做受又硬又粗又大视频√| 国产乱人伦偷精精品视频| 人人爽人人澡人人人人妻| 自拍亚洲综合在线精品| 精品人妻少妇AV一区二区三区| 我是你亲妈呀你爸知道死你| 被陌生人带去卫生间啪到腿软| 麻豆国产一卡二卡三卡| 亚洲国产成人精品无码区二本| 国产成人一区二区三区| 日韩精品人妻无码久久影院| 91人人妻人人做人人爱 | 亚洲色偷偷综合亚洲av伊人| 国产精品久久久久永久免费看| 日韩精品少妇无码受不了 | 脱了老师内裤猛烈进入的软件 | 下面饿了想吃大香肠| 丰满多毛的大隂户毛茸茸| 去掉小内打扑克的视频| 中文乱码人妻一区二区三区视频| 精品久久亚洲中文字幕| 亚洲AⅤ无码一级毛片孕交| 国产SUV精品一区二区33| 日本在线 | 中文| AI换脸造梦JENNIE喷水| 免费观看高清日本AⅤ| 亚洲熟妇AV一区二区三区宅男| 天堂А√在线地址中文在线| 2022精品久久久久久中文字幕| 久久久久久精品人妻免费网站| 亚洲国产成人乱码| 国产香蕉尹人在线视频你懂的| 无码H黄肉动漫在线观看999| 丰满饱满极品熟妇XXXX| 色欲av夜夜嗨av性色av| 被多人玩弄的烂货苏妖精| 全棵女性艺术写真| AV中文字幕潮喷人妻系列| 欧美 亚洲 国产 另类| 中国人妻XXXXX免费看| 老奶奶能叫WOMAN吗| 一本大道香蕉在线资源| 久久天天躁夜夜躁狠狠躁2022| 亚洲无人区码二码三码区别| 精品一区二区三区免费乱码视频| 亚洲国产综合无码一区二区BT下| 国语精品自产拍在线观看网站| 亚洲AV无码乱码国产麻豆穿越| 国产亚洲欧美精品久久久| 亚洲AV成本人无码网站| 国产亚洲欧美日韩俺去了| 亚洲不卡无码永久在线 | 夜夜躁狠狠躁日日躁2022| 久久久久99精品国产片| 一本加勒比HEZYO无码人妻| 久久亚洲AV成人无码国产| 一线产区与二线产区的定义| 麻豆成人精品国产免费| 中文字幕一区日韩精品| 男人扒开女人内裤强吻桶进去| 939W78V78W乳液永久W| 琪琪女色窝窝777777| 餐桌下手指噗呲噗呲| 色天天躁夜夜躁天干天干| 国产99视频精品免费视看6| 无码中文字幕人妻在线一区二区三 | 少妇人妻综合久久中文888| 国产成人精品一区二区三区| 无码无套少妇毛多18PXXXX| 国产亚洲日韩在线A不卡| 亚洲成AV人片一区二区小说| 欧美丰满少妇内射XXXX免费| 又湿又紧又大又爽A视频国产| 六十路五十路精品久久久久| 中文字幕在线亚洲日韩6页| 欧美激情综合色综合啪啪五月| 把女的下面扒开添视频 | 亚洲 欧美 综合 在线 精品| 狠狠做五月深爱婷婷| 亚洲日韩一区二区三区波多野结衣 | 韩国三级在线观看完整版| 亚洲日韩在线中文字幕综合 | 亚洲AV无码成人网站久久精品大 | 天无日天天射天天视| 国产无套护士在线观看| 亚洲人妻av在线| 免费网站看V片在线18禁| 锕锕锕锕锕锕好污网站入口推特 | 日韩人妻无码中文字幕视频| 国产精品无码一区二区在线观一| 亚洲Av无码成人黄网站在线| 久久久久99精品成人片欧美| 99久久久国产精品免费| 色婷婷婷亚洲综合丁香五月| 国产乱妇乱子在线播放视频| 亚洲欧洲精品成人久久曰| 内射精品无码中文字幕| 成年网站免费视频黄A站| 性生交片免费无码看人| 久久精品人人做人人综合试看 | 久久久久亚洲AV无码专区首| A级毛片免费网站| 玩弄漂亮少妇高潮大叫| 九九电影网午夜理论片| 97精品国产97久久久久久免费| 揉大N呻吟水多大棒子| 国语对白做受XXXXX在线| 在线观看亚洲区激情AV| 日韩AV高清在线观看| 国产亚洲精久久久久久无码7 | 色诱久久久久综合网YWWW | 亚洲AV永久无码老湿机男人网| 麻豆文化传媒精品一区观看| 纯肉高H爽文粗大| 亚洲国产精品成人午夜在线观看| 男女性色大片免费网站| 国产成人AV无码永久免费| 亚洲色大成网站WWW在线观看| 欧美男女一进一出| 国产欧美精品一区二区三区四区 | 日本一线二线三线四线五线 | 久久久久精品无码AV| 把舌头伸进她腿间花缝| 亚洲 校园 欧美 国产 另类| 免费播放片Ⅴ免费人成视频| 国产国产精品人在线观看| 亚洲一区二区三区偷拍女厕| 日本无人区一线影视| 禁欲少校大哥的囚禁| AV无码免费无禁网站| 亚洲AV成人无码精品网站按| 女强人被春药精油按摩4| 国产精品亚洲VA在线| 中文字幕人妻色偷偷久久 | 四虎永久在线精品视频| 久久久久久久久久久精品尤物| 顶级欧美熟妇高清XXXXX| 亚洲欭美日韩颜射在线| 色噜噜综合亚洲AV中文无码| 久久精品国产99国产精偷| 成人毛片女18免费| 亚洲伊人成无码综合影院| 色婷婷欧美在线播放内射| 久久久久无码精品国产| 国产成人精品三级麻豆| 中国熟妇色XXXXX| 性开放按摩AV大片| 欧美人与性动交α欧美精品 | 中文字幕亚洲综合小综合在线 | 别揉我奶头~嗯~啊~动态图视频| 亚洲国产A∨无码中文777| 日韩成人无码AV| 久久天天躁狠狠躁夜夜96流白浆| 公粗挺进了我的密道在线观看| 曰本A级毛片无卡免费视频VA| 无人区码二码三码四码区别| 欧美极品JIZZHD欧美| 精产一二三产区区别在哪| 动漫AV成人无码精品网站| 中文字幕无码一区二区黑人巨大| 性丰满ⅩXXOOOZZXXHD| 日本边添边摸边做边爱小视频| 久久精品无码中文字幕老司机| 国产成人无码H在线观看网站| 8X8Ⅹ成人免费视频在线观看| 亚洲爆乳无码专区| 少妇无码一区二区二三区| 内射女校花一区二区三区| 黑料社ZZTT.WIN免费观看| 丰满少妇人妻XXXXX| 97性无码区免费| 亚洲最大的AV无码网站| 午夜福利理论片高清在线观看 | 做AJ的姿势教程大全图| 亚洲成AV人片一区二区| 挺进去岳就不挣扎了在线观看| 人妻丰满熟妇AV无码区乱| 麻豆文化传媒精品|