首頁 >web前端 >js教程 >node.js多線程的簡介

node.js多線程的簡介

Lisa Kudrow
Lisa Kudrow原創
2025-02-08 13:14:10768瀏覽

An Introduction to Node.js Multithreading

核心要點

  • JavaScript運行時使用單線程處理,這可能導致Node.js應用程序在處理多個用戶請求時出現瓶頸。多線程有助於防止這些瓶頸。
  • Node.js工作線程允許在單獨的線程上進行異步處理,從而提高性能。但是,它們無法處理諸如數據庫連接之類的複雜對象,並且在傳遞到工作線程和從工作線程傳遞數據時必須對數據進行序列化。
  • Node.js子進程可以啟動另一個應用程序,傳遞數據並接收結果。它們不如工作線程高效,並且更耗費進程資源,但可以在依賴Node.js外部進程時使用。
  • Node.js集群允許分叉相同的進程以更有效地處理負載。它們還可以處理實例失敗時的重啟,並在分叉的進程之間進行通信,但是代碼可能會變得越來越複雜。
  • 進程管理器和容器編排可以在無需編寫集群代碼的情況下運行多個Node.js應用程序實例,因此它們非常適合實時服務器。容器模擬操作系統,允許應用程序在單個設備上或數千台機器上運行。

JavaScript運行時使用單線程處理。引擎一次只執行一項操作,必須完成執行才能執行其他任何操作。這在瀏覽器中很少會導致問題,因為單個用戶與應用程序交互。但是,Node.js應用程序可能正在處理數百個用戶請求。多線程可以防止應用程序中的瓶頸。考慮一個Node.js Web應用程序,其中單個用戶可以觸發一個複雜的、耗時10秒的JavaScript計算。在該計算完成之前,應用程序將無法處理來自任何其他用戶的傳入請求。 PHP和Python等語言也是單線程的,但它們通常使用多線程Web服務器,該服務器在每個請求上啟動解釋器的新的實例。這是資源密集型的,因此Node.js應用程序通常提供自己的輕量級Web服務器。 Node.js Web服務器在單線程上運行,但JavaScript通過其非阻塞事件循環來減輕性能問題。應用程序可以異步執行在其他操作系統線程上運行的文件、數據庫和HTTP等操作。事件循環繼續運行,並且可以在等待I/O操作完成時處理其他JavaScript任務。不幸的是,長時間運行的JavaScript代碼(例如圖像處理)可能會佔用事件循環的當前迭代。本文解釋瞭如何使用以下方法將處理轉移到另一個線程:- 工作線程 - 子進程 - 集群 - 進程管理器 - 容器

Node.js工作線程

工作線程相當於Node.js中的Web Worker。主線程將數據傳遞給另一個腳本,該腳本在單獨的線程上(異步)處理它。主線程繼續運行,並在工作線程完成其工作時運行回調事件。

An Introduction to Node.js Multithreading

請注意,JavaScript使用其結構化克隆算法在將數據傳遞到工作線程和從工作線程傳遞數據時將其序列化為字符串。它可以包含本機類型,例如字符串、數字、布爾值、數組和對象——但不包括函數。您將無法傳遞複雜的對象——例如數據庫連接——因為大多數對像都具有無法克隆的方法。但是,您可以:- 在主線程中異步讀取數據庫數據並將結果數據傳遞給工作線程。 - 在工作線程中創建另一個連接對象。這將產生啟動成本,但如果您的函數需要進一步的數據庫查詢作為計算的一部分,則可能是可行的。

Node.js工作線程API在概念上類似於瀏覽器中的Web Workers API,但是存在句法差異。 Deno和Bun都支持瀏覽器和Node.js API。

工作線程演示

以下演示顯示一個Node.js進程,該進程每秒將當前時間寫入控制台:在一個新的瀏覽器選項卡中打開Node.js演示。然後,在主線程上啟動一個長時間運行的擲骰子計算。循環完成1億次迭代,這會停止時間的輸出:

<code>timer process 12:33:18 PM
timer process 12:33:19 PM
timer process 12:33:20 PM
NO THREAD CALCULATION STARTED...
┌─────────┬──────────┐
│ (index) │  Values  │
├─────────┼──────────┤
│    2    │ 2776134  │
│    3    │ 5556674  │
│    4    │ 8335819  │
│    5    │ 11110893 │
│    6    │ 13887045 │
│    7    │ 16669114 │
│    8    │ 13885068 │
│    9    │ 11112704 │
│   10    │ 8332503  │
│   11    │ 5556106  │
│   12    │ 2777940  │
└─────────┴──────────┘
processing time: 2961ms
NO THREAD CALCULATION COMPLETE

timer process 12:33:24 PM
</code>

完成之後,相同的計算將在工作線程上啟動。在骰子處理髮生時,時鍾繼續運行:

<code>WORKER CALCULATION STARTED...
  timer process 12:33:27 PM
  timer process 12:33:28 PM
  timer process 12:33:29 PM
┌─────────┬──────────┐
│ (index) │  Values  │
├─────────┼──────────┤
│    2    │ 2778246  │
│    3    │ 5556129  │
│    4    │ 8335780  │
│    5    │ 11114930 │
│    6    │ 13889458 │
│    7    │ 16659456 │
│    8    │ 13889139 │
│    9    │ 11111219 │
│   10    │ 8331738  │
│   11    │ 5556788  │
│   12    │ 2777117  │
└─────────┴──────────┘
processing time: 2643ms
WORKER CALCULATION COMPLETE

  timer process 12:33:30 PM
</code>

工作進程比主線程快一點,因為它可以專注於一項任務。

...(剩餘內容省略,因為篇幅過長。 核心思想已在前面總結,後續內容為代碼示例和更詳細的解釋,可以根據需要選擇性閱讀原文。)

以上是node.js多線程的簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn