淺析Node.js使用worker_threads多執行緒進行並行處理

2022-03-17 22:02:56
如何使用 Node.js 進行並行處理?下面本篇文章就來給大家介紹一下使用 多執行緒進行並行處理的方法,希望對大家有所幫助!

很多人似乎都無法理解單執行緒 NodeJS 是如何與多執行緒後端競爭的。

要找出原因,我們必須瞭解 是單執行緒的真正含義。

JavaScript 本身最初是為了做一些簡單的事情而建立的,比如驗證表單、做出響應等,直到 2009 年,Node.js 的建立者 Ryan Dahl 才使使用 JavaScript 編寫伺服器端程式碼成為可能。

支援多執行緒的伺服器端語言具有各種結構和構造,用於線上程和其他面向執行緒的特性之間同步。

支援這些東西意味著 JavaScript 需要改變整個語言,而這也違背了javascript締造者的想法。因此,為了讓純 JavaScript 支援多執行緒,Dahl 必須建立一種解決方法。讓我們來看看吧!


Node.js 是如何工作的?

Node.js 使用兩種執行緒:由事件迴圈處理的主執行緒和工作執行緒池的幾個輔助執行緒。

事件迴圈Node.js 處理非阻塞 I/O 操作的機制——儘管 JavaScript 是單執行緒處理的——當有可能的時候,它們會把操作轉移到系統核心中去。當 JavaScript 操作阻塞執行緒時,事件迴圈也被阻塞。

工作池是一種執行模型,它產生和處理單獨的執行緒,然後同步執行任務並將結果返回給事件迴圈。然後事件迴圈使用所述結果執行提供的回撥。

基本上,工作池處理非同步 I/O 操作——主要是與系統磁碟和網路的互動。一些模組使用開箱即用的工作池,例如 fs(I/O-heavy)或 crypto(CPU-heavy)。工作池是在 libuv 中實現的,當 Node 需要在 JavaScript 和 C++ 之間內部傳輸資料時,這會導致輕微的延遲,但幾乎可以忽略。

理解了事件迴圈和工作池的含義之後 我們看下下面程式碼:

1.png

在上面的程式碼中,我們不必同步等待事件。我們將讀取檔案的任務委託給工作池,並使用結果呼叫提供的函數。由於工作池有自己的執行緒,因此事件迴圈可以在讀取檔案的同時繼續正常執行。


給大家介紹一下:worker_threads

隨著 Node.js 10.5.0 的釋出,出現了 worker_threads。它支援在 JavaScript 中建立簡單的多執行緒應用程式

worker_threads 是一個nodejs模組包。執行緒工作者是在單獨執行緒中生成的一段程式碼(通常從檔案中取出)。

需要注意的是,術語執行緒工作者、工作者和執行緒通常可以互換使用。它們都指的是同一件事。

2.png

Node.js 中的工作執行緒對於執行繁重的 JavaScript 任務很有用。線上程的幫助下,Worker 可以輕鬆地並行執行 JavaScript 程式碼,從而使其更快、更高效。我們可以在不干擾主執行緒的情況下完成繁重的任務。

舊版本的 Node.js 中沒有引入工作執行緒。因此,首先更新您的 Node.js 以開始使用。

現在建立兩個檔案來實現執行緒,如下所示:

檔名: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));

輸出:

3.png

更多node相關知識,請存取:!

以上就是淺析Node.js使用worker_threads多執行緒進行並行處理的詳細內容,更多請關注TW511.COM其它相關文章!