這篇文章給大家分享的是有關(guān)Node.js如何使用worker_threads多線程進(jìn)行并行處理的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)建站是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:響應(yīng)式網(wǎng)站設(shè)計(jì)、成都品牌網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站。我們專注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。
很多人似乎都無(wú)法理解單線程 NodeJS 是如何與多線程后端競(jìng)爭(zhēng)的。
要找出原因,我們必須了解 Nodejs 是單線程的真正含義。
JavaScript 本身最初是為了做一些簡(jiǎn)單的事情而創(chuàng)建的,比如驗(yàn)證表單、做出響應(yīng)等,直到 2009 年,Node.js 的創(chuàng)建者 Ryan Dahl 才使使用 JavaScript 編寫(xiě)服務(wù)器端代碼成為可能。
支持多線程的服務(wù)器端語(yǔ)言具有各種結(jié)構(gòu)和構(gòu)造,用于在線程和其他面向線程的特性之間同步。
支持這些東西意味著 JavaScript 需要改變整個(gè)語(yǔ)言,而這也違背了javascript締造者的想法。因此,為了讓純 JavaScript 支持多線程,Dahl 必須創(chuàng)建一種解決方法。讓我們來(lái)看看吧!
Node.js 是如何工作的?
Node.js 使用兩種線程:由事件循環(huán)處理的主線程和工作線程池的幾個(gè)輔助線程。
事件循環(huán)Node.js 處理非阻塞 I/O 操作的機(jī)制——盡管 JavaScript 是單線程處理的——當(dāng)有可能的時(shí)候,它們會(huì)把操作轉(zhuǎn)移到系統(tǒng)內(nèi)核中去。當(dāng) JavaScript 操作阻塞線程時(shí),事件循環(huán)也被阻塞。
工作池是一種執(zhí)行模型,它產(chǎn)生和處理單獨(dú)的線程,然后同步執(zhí)行任務(wù)并將結(jié)果返回給事件循環(huán)。然后事件循環(huán)使用所述結(jié)果執(zhí)行提供的回調(diào)。
基本上,工作池處理異步 I/O 操作——主要是與系統(tǒng)磁盤(pán)和網(wǎng)絡(luò)的交互。一些模塊使用開(kāi)箱即用的工作池,例如 fs(I/O-heavy)或 crypto(CPU-heavy)。工作池是在 libuv 中實(shí)現(xiàn)的,當(dāng) Node 需要在 JavaScript 和 C++ 之間內(nèi)部傳輸數(shù)據(jù)時(shí),這會(huì)導(dǎo)致輕微的延遲,但幾乎可以忽略。
理解了事件循環(huán)和工作池的含義之后 我們看下下面代碼:
在上面的代碼中,我們不必同步等待事件。我們將讀取文件的任務(wù)委托給工作池,并使用結(jié)果調(diào)用提供的函數(shù)。由于工作池有自己的線程,因此事件循環(huán)可以在讀取文件的同時(shí)繼續(xù)正常執(zhí)行。
給大家介紹一下:worker_threads
隨著 Node.js 10.5.0 的發(fā)布,出現(xiàn)了 worker_threads。它支持在 JavaScript 中創(chuàng)建簡(jiǎn)單的多線程應(yīng)用程序
worker_threads 是一個(gè)nodejs模塊包。線程工作者是在單獨(dú)線程中生成的一段代碼(通常從文件中取出)。
需要注意的是,術(shù)語(yǔ)線程工作者、工作者和線程通常可以互換使用。它們都指的是同一件事。
Node.js 中的工作線程對(duì)于執(zhí)行繁重的 JavaScript 任務(wù)很有用。在線程的幫助下,Worker 可以輕松地并行運(yùn)行 JavaScript 代碼,從而使其更快、更高效。我們可以在不干擾主線程的情況下完成繁重的任務(wù)。
舊版本的 Node.js 中沒(méi)有引入工作線程。因此,首先更新您的 Node.js 以開(kāi)始使用。
現(xiàn)在創(chuàng)建兩個(gè)文件來(lái)實(shí)現(xiàn)線程,如下所示:
文件名:worker.js
const { workerData, parentPort } = require('worker_threads'); console.log(`Write-up on how ${workerData} wants to chill with the big boys`); parentPort.postMessage({ filename: workerData, status: 'Done' });
文件名:index.js
const { Worker } = require('worker_threads'); const runSerice = (workerData) => { return new Promise((resolve, reject) => { const worker = new Worker('./worker.js', { workerData }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker Thread stopped with exit code ${code}`)); }); }); }; const run = async () => { const result = await runSerice('Tunde Ednut'); console.log(result); }; run().catch((err) => console.error(err));
輸出:
感謝各位的閱讀!關(guān)于“Node.js如何使用worker_threads多線程進(jìn)行并行處理”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!