核心要點
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。主線程將數據傳遞給另一個腳本,該腳本在單獨的線程上(異步)處理它。主線程繼續運行,並在工作線程完成其工作時運行回調事件。
請注意,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中文網其他相關文章!