激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

香港云服务器
服務器之家 - 編程語言 - JavaScript - Node.js 中的多線程和多進程

Node.js 中的多線程和多進程

2021-04-21 01:34前端先鋒瘋狂的技術宅 JavaScript

Node.js 是一個免費的跨平臺 JavaScript 運行時環境,盡管它本質上是單線程的,但是可以在后臺使用多個線程來執行異步代碼。

Node.js 是一個免費的跨平臺 JavaScript 運行時環境,盡管它本質上是單線程的,但是可以在后臺使用多個線程來執行異步代碼。

由于 Node.js 的非阻塞性質,不同的線程執行不同的回調,這些回調首先委托給事件循環。Node.js 運行時負責處理所有這一切。

Node.js 中的多線程和多進程

為什么要用 NodeJS?

 

JavaScript 最初是作為一種單線程編程語言構建的,僅在 Web 瀏覽器中運行。這意味著在一個過程中,只有一組指令能夠在給定的時間執行。

僅在當前代碼塊的執行完成后,才移至下一個代碼塊。但是,JavaScript 的單線程性質使實現變得容易。

最初 JavaScript 僅用于向網站添加少量交互。所以并沒有對多線程的需求。但是時代已經變了,用戶要求也越來越高,JavaScript 已成為 Web 上流行的編程語言。

多線程現在變得很普遍。由于 JavaScript 是單線程語言,因此無法在其中實現多線程。幸運的是,在這種情況下,有一個很好的解決方法:Node.js。

Node.js 框架并不少,這要歸功于 JavaScript 運行時環境(尤其是 JavaScript)的普遍流行。在繼續本文之前,讓我們了解一些有關 Node.js 的重要觀點:

  • 可以用 send 函數將消息從子進程傳遞到其他子進程和主進程
  • 支持 fork 多個進程
  • 主進程和子進程之間不共享狀態

為什么要 fork 進程?

 

在兩種情況下,我們需要 fork 一個流程:

  • 通過將任務委派給其他進程來提高速度
  • 用于釋放內存和卸載單個進程

可以將數據發送到子進程,也可以將其送回。

Node.js 的方式

 

Node.js 使用兩種類型的線程:

  • 通過事件循環處理主線程,
  • 工作池中有許多輔助線程

事件循環負責獲取回調或函數,并將其注冊以供將來執行。它與正確的 JavaScript 代碼在同一線程中運行。一旦 JavaScript 操作阻塞了線程,事件循環也會被阻塞。

工作池是一個執行模型,負責產生和處理不同的線程。它同步執行任務,然后將結果返回到事件循環,最后事件循環將結果提供給回調。

總而言之,工作池負責異步 I/O 操作,即與系統磁盤和網絡的交互。像 fs 和 crypto 這樣的模塊是使用工作池的主要模塊。

由于工作池是在 libuv 庫中實現的,Node.js 在 JS 和 C++ 之間進行內部通信時會稍有延遲。不過這幾乎是不可察覺的。

一切都很好,直到我們遇到同步執行復雜操作的要求。任何需要大量時間執行的函數都會導致主線程阻塞。

如果程序具有多個占用大量 CPU 的函數,將會導致服務器吞吐量的顯著下降。在最壞的情況下,服務器將會失去響應,并且無法將任務委派給工作池。

諸如 AI、大數據和機器學習之類的領域無法從 Node.js 中受益,因為這些操作阻塞了主線程,并使服務器失去響應。但是這隨著 Node.js v10.5.0 的到來而改變,該版本增加了對多線程的支持。

并發和 CPU 綁定任務的挑戰

 

在 JavaScript 中建立并發可能很困難。允許多個線程訪問相同的內存會導致競爭狀態,這不僅使故障難以重現,而且解決起來也很困難。

Node.js 最初被實現為基于異步 I/O 的服務器端平臺。通過簡單地消除線程需求,這使很多事情變得容易。是的,Node.js 程序是單線程的,但不是典型的方式。

我們可以在 Node.js 中并行運行,但是不需要創建線程。操作系統和虛擬機共同并行使用 I/O,然后在需要將數據發送回 JavaScript 代碼時,JS 代碼在單個線程中運行。

除 JS 代碼外,所有內容均在 Node.js 中并行運行。與異步塊不同,JS 的同步塊總是一次執行一次。與代碼執行相比,等待 JS 中產生 I/O 事件所話費的時間要多得多。

Node.js 程序僅調用所需的函數或回調,而不會阻止其他代碼的執行。最初 JavaScript 和 Node.js 都不打算處理 CPU 密集型或 CPU 綁定的任務。

當代碼最少時,執行將會是敏捷的。但是計算量越大,執行速度就越慢。

如果你仍然嘗試在 JS 和 Node 中完成 CPU 密集型任務,那么將會使瀏覽器中的 UI 凍結并對所有 I/O 事件進行排隊處理。盡管如此,我們已經走了很遠。現在有了 worker_threads 模塊。

worker_threads 模塊使多線程變得簡單

 

Node.js v10.5.0 于 2018 年 6 月發布,引入了 worker_threads 模塊。它有助于在流行的 JavaScript 運行時環境中實現并發。該模塊允許創建功能齊全的多線程 Node.js 應用。

從技術上講,工作線程是在單獨的線程中產生的一些代碼。要開始使用輔助線程,需要先導入 worker_threads 模塊。之后需要創建 Worker 類的實例以創建工作線程。

創建 Worker 類的實例時,有兩個參數:

  • 第一個參數提供擴展名 .js 或 .mjs 的文件路徑,其中包含工作程序線程的代碼,
  • 第二個參數提供了一個包含 workerData 屬性的對象,該屬性包含工作線程開始執行時將訪問的數據

輔助線程能夠調度多個消息事件。因此,回調方法優先于返回 promise。

工作線程之間的通信是基于事件的,即偵聽器設置為在工作線程發送事件后立即調用。最常見的 4 個事件是:

  1. worker.on('error', (error) => {}); 

(1) 當工作線程中有未捕獲的異常時發出。接下來工作線程終止,并且該錯誤可以作為回調中的第一個參數使用。

  1. worker.on('exit', (exitCode) => {}) 

(2) 當輔助線程退出時發出。如果在工作線程中調用了 process.exit(),則會將 exitCode 提供給回調。如果 worker.terminate() 終止工作線程,則代碼為 1。

  1. worker.on('message', (data) => {}); 

(3) 當工作線程將數據發送到父線程時發出。

  1. worker.on('online', () => {}); 

(4) 當工作線程停止解析 JS 代碼并開始執行時發出。盡管不常用,但 online 事件在特定情況下可能會提供更多信息。

使用工作線程的方式

 

有兩種使用工作線程的方法:

  • 方法 1 – 涉及產生工作線程,執行其代碼并將結果發送到父線程。此方法需要每次為新任務從頭創建新的 worker 線程。
  • 方法 2 – 涉及生成 worker 線程并為消息事件設置偵聽器。每次觸發該消息時,輔助線程都會執行代碼,并將結果發送回父線程。輔助線程保持活動狀態,以備將來使用。

方法 2 也被稱為工作池。這是因為該方法涉及創建 worker 的工作池,先讓他們等待,并在需要時去調度消息事件來執行任務。

由于從頭創建工作線程需要創建虛擬機以及解析和執行代碼,因此官方 Node.js 文檔 建議采用方法 2。此外,方法 2 更為實用,比方法 1 更有效。

(1) worker_threads 模塊中可用的重要屬性

  • isMainThread – 當不在工作線程內操作時,此屬性為 true。如果需要,則可以在 worker 文件的開頭包含一個簡單的 if 語句。這樣可以確保它僅作為工作線程運行。
  • parentPort – MessagePort 的實例,用于與父線程進行通信。
  • threadId – 分配給工作線程的唯一標識符。
  • workerData – 包含在 worker 線程的構造函數中的數據。

(2) Node.js 中的多進程

為了使 Node.js 利用多核系統的功能,可以用一些進程。流行的 javascript 運行時環境中有稱被為 cluster 的模塊,該模塊提供對多進程的支持。

使用 cluster 模塊可以產生多個子進程,這些子進程可以共享一個公共端口。當子進程投入使用時,使用 NodeJS 的系統可以處理更大的工作量。

(3) 后端的 Node.js

互聯網已經成為全球數以百萬計公司的首選平臺。因此,為使一家企業發揮最大潛力,并在此過程中脫穎而出,必須擁有強大的網絡形象。

這一切都始于一個強大而直觀的網站。要打造一個完美無瑕的網站,重要的是選擇最佳的前端和后端技術。盡管本質上是單線程的,但 Node.js 是開發后端 Web 服務的首選。

盡管有大量的后端多線程選擇,但知名公司還是喜歡 Node.js。這是因為 Node.js 提供了在 JavaScript 中使用多線程的變通方法,而 JavaScript 已經是“Web上最流行的編程語言”。

總結

 

worker_threads 模塊提供了一種在 Node.js 程序中實現多線程的簡便方法。通過將繁重的計算委派給工作線程,可以顯著提高服務器的吞吐量。

借助對多線程的支持,Node.js 將繼續吸引越來越多的來自 AI、大數據和機器學習等計算密集型領域的開發人員、工程師和其他專業人員。

原文地址:https://mp.weixin.qq.com/s?__biz=MzI3NzIzMDY0NA==&mid=2247501181&idx=1&sn=e12e187469a9566d271dd8556021f67c&chksm=eb6be026dc1c6930c8bc1984a5dd5aaa3f4fbdc6b9a9405ca45b67715ef33fb988e3f04e05b0&mpshare=1&s

延伸 · 閱讀

精彩推薦
955
主站蜘蛛池模板: 国产欧美在线一区二区三区 | 超碰97人人艹 | 色网站免费观看 | 香蕉国产片 | 日韩在线激情 | 毛片一区二区三区 | 亚洲一区二区中文 | av免费在线播放 | 在线观看免费污视频 | 亚洲视频观看 | 精品亚洲午夜久久久久91 | 国产精品一区二区在线 | 蜜桃麻豆视频 | 免费a级网站 | 亚洲一区播放 | 特级黄色一级毛片 | 国产成人精品免费视频大全办公室 | 日本黄色大片免费观看 | 欧美成人精品不卡视频在线观看 | 久久蜜桃香蕉精品一区二区三区 | 黄色av.com | 国产69精品久久久久久久久久 | 国产九九 | 日韩视频―中文字幕 | 91精品久久久久久久久 | 天天草天天干天天射 | 国产精品久久久久久婷婷天堂 | 欧美日韩网站在线观看 | 欧美成人午夜精品久久久 | 免看一级片 | 成人偷拍片视频在线观看 | 欧美wwwwww| 激情亚洲一区二区 | v11av在线播放 | 国产一级毛片网站 | 香蕉在线播放 | av在线播放亚洲 | 中午字幕无线码一区2020 | 国产精品v片在线观看不卡 成人一区二区三区在线 | 国产精品久久久久久久久久大牛 | 久久精品国产一区二区电影 |