Web Workers:JavaScript中的多執行緒


隨著 Web 應用變得越來越複雜和需求越來越高,對高效和響應式處理的需求也變得越來越重要。JavaScript 作為一種單執行緒語言,有時在處理可能導致使用者介面緩慢和應用無響應的繁重計算任務時會遇到困難。但是,隨著 Web Workers 的引入,JavaScript 獲得了利用多執行緒的能力,從而提高了效能並增強了使用者體驗。在本文中,我們將深入探討 Web Workers 的世界,並探索它們如何實現 JavaScript 中的多執行緒。

理解對 Web Workers 的需求

在傳統的 JavaScript 中,單執行緒性質意味著所有任務,包括 DOM 操作、事件處理和計算,都在一個稱為主執行緒的單執行緒中執行。雖然這種方法適用於大多數場景,但在處理消耗大量時間的計算密集型操作時,它可能會成為瓶頸。這些操作可能會導致使用者體驗下降,導致瀏覽器凍結或無響應,直到任務完成。

Web Workers 透過引入後臺執行緒解決了這個問題。後臺執行緒,也稱為工作執行緒,允許我們將密集型計算和耗時任務解除安裝到單獨的執行緒,從而釋放主執行緒來處理其他重要活動,例如 UI 更新和使用者互動。

介紹 Web Workers

Web Worker 是一個在後臺執行的 JavaScript 指令碼,與主執行緒分開,可以執行計算密集型操作而不會阻塞使用者介面。這個後臺指令碼,稱為專用工作執行緒,可以使用 Worker 建構函式建立,並將工作執行緒指令碼的 URL 作為引數傳遞。

main.js

// main.js

// Creating a new Web Worker
const worker = new Worker('worker.js');

worker.js

// worker.js

// This is the worker script that runs in the background
self.onmessage = function(event) {
   // Perform computationally intensive tasks here
   // Access data from event.data
   // Send back the result using postMessage()
};

解釋

在上面的示例中,我們透過在 main.js 檔案中例項化 Worker 物件來建立一個新的 Web Worker。作為引數提供的 URL 指向工作執行緒指令碼 worker.js,其中包含在後臺執行緒中執行的程式碼。

與 Web Workers 通訊

主執行緒和 Web Worker 之間的通訊是透過訊息傳遞機制實現的。主執行緒可以使用 postMessage() 方法向工作執行緒傳送訊息,而工作執行緒可以使用onmessage事件處理程式監聽傳入的訊息。

main.js

// main.js

// Sending a message to the worker
worker.postMessage('Hello from the main thread!');

worker.js

// worker.js

// Listening for messages from the main thread
self.onmessage = function(event) {
   // Access the message using event.data
   console.log('Message from the main thread:', event.data);
  
   // Sending a response back to the main thread
   self.postMessage('Hello from the Web Worker!');
};

解釋

在這個例子中,主執行緒使用 worker.postMessage() 向 Web Worker 傳送訊息,並將字串作為訊息傳遞。Web Worker 使用 self.onmessage 監聽傳入的訊息並記錄收到的訊息。此外,它還使用 self.postMessage() 向主執行緒傳送響應。

處理 Worker 響應

為了處理來自 Web Worker 的響應,主執行緒可以使用 onmessage 事件處理程式監聽來自工作執行緒的訊息。然後可以相應地處理收到的訊息。

main.js

// main.js

// Listening for messages from the worker
worker.onmessage = function(event) {
   console.log('Message from the Web Worker:', event.data);
};

解釋

在此程式碼片段中,主執行緒監聽來自 Web Worker 的訊息,並使用 event.data 記錄收到的訊息。

示例

讓我們考慮一下下面顯示的完整程式碼。

index.html

<!DOCTYPE html>
<html>
<head>
  <title>Web Worker Example</title>
  <script src="main.js"></script>
</head>
<body>
  <h1>Web Worker Example</h1>
</body>
</html>

main.js

// main.js

// Creating a new Web Worker
const worker = new Worker('worker.js');

// Sending a message to the worker
worker.postMessage('Hello from the main thread!');

// Listening for messages from the worker
worker.onmessage = function(event) {
   console.log('Message from the Web Worker:', event.data);
};

worker.js

// worker.js

// Listening for messages from the main thread
self.onmessage = function(event) {
   console.log('Message from the main thread:', event.data);
  
   // Sending a response back to the main thread
   self.postMessage('Hello from the Web Worker!');
};

注意 - 要執行以上程式碼,請透過本地伺服器執行 HTML 程式碼。

輸出

Web Workers 的優點和缺點

在增強 Web 應用的效能和響應能力方面,Web Workers 提供了許多好處:

  • 多執行緒 Web Workers 允許並行處理,使計算密集型任務能夠在後臺執行而不會阻塞主執行緒。

  • 改進的響應能力 透過將繁重任務解除安裝到 Web Workers,主執行緒仍然可以處理使用者互動,從而實現更具響應性的使用者介面。

  • 高效的資源利用 Web Workers 利用額外的 CPU 核心,最大限度地利用可用的計算資源並加快處理時間。

儘管 Web Workers 具有許多優點,但也有一些限制需要考慮:

  • 無法訪問 DOM Web Workers 無法直接訪問或操作 DOM。它們僅限於執行計算和其他非 DOM 相關任務。

  • 受限的範圍 Web Workers 在其自己的隔離範圍內執行,並且無法訪問父頁面的變數或函式。通訊僅透過訊息傳遞實現。

  • 額外的開銷 建立和管理 Web Workers 會由於主執行緒和工作執行緒之間的通訊而產生一些開銷。在決定將任務解除安裝到工作執行緒時,應注意開銷可能超過小型計算的益處。

結論

在本文中,我們探討了 JavaScript 中 Web Workers 的強大功能,它可以實現多執行緒並提高 Web 應用的效能。我們學習瞭如何建立 Web Workers、建立主執行緒和工作執行緒之間的通訊以及處理響應。透過利用 Web Workers,開發人員可以將計算密集型任務解除安裝到後臺執行緒,從而獲得更具響應性和效率的使用者體驗。

更新於:2023年7月25日

199 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告