一文聊聊node的多進程和多線程
這篇文章帶大家了解一下node.js,介紹一下node中的多進程和多線程,對比一下多進程和多線程,希望對大家有幫助!
node.js中的多進程與多執行緒
#在node.js中,javascript程式碼的執行是單執行緒執行的,可是Node 本身其實是多執行緒的。
node本身又分為三層
第一層,Node .js 標準函式庫,這部分是由Javascript寫的,也就是我們使用過程中直接能呼叫的API,在原始碼中的lib 目錄下可以看到。
第二層,Node bindings,這一層是Javascript 與底層C/C 能夠溝通的關鍵,前者透過bindings 呼叫後者,相互交換數據,是第一層和第三層的橋樑。
第三層,是支撐 Node.js 運行的關鍵,由 C/C 實現,是node實現的一些底層邏輯。
其中,第三層的Libuv,為 Node.js 提供了跨平台,線程池,事件池,非同步 I/O 等能力,是 Node.js 如此強大的關鍵。
由於Libuv提供了事件循環機制,所以在io處理方面,javascript並不會發生阻塞,所以我們用node搭建web服務時,並不需要擔心io量過大,導致其他請求阻塞。
可是,非io任務的執行,是在node主執行緒中執行的,是單執行緒執行任務,如果有非常消耗時間的同步運算任務,將會阻塞其他程式碼的執行。
const Koa = require('koa'); const app = new Koa(); app.use(async (ctx) => { const url = ctx.request.url; if (url === '/') { ctx.body = {name: 'xxx', age: 14} } if(url==='/compute'){ let sum=0 for (let i = 0; i <100000000000 ; i++) { sum+=i } ctx.body={sum} } }) app.listen(4000, () => { console.log('http://localhost:4000/ start') })
上面這串程式碼,如果http請求了/compute
,node會呼叫cpu進行大量的計算,這時如果有其他http請求進入,將會發生阻塞。
那麼要如何解決這個問題呢?
有兩種方案,一種是使用children_process
或cluster
開啟多進程進行計算,另一種是使用worker_thread
#開啟多執行緒進行運算
多行程vs 多執行緒
#對比多執行緒與多行程:
屬性 | 多重行程 | 多執行緒 | 比較 |
---|---|---|---|
數據共享複雜,需要用IPC;數據是分開的,同步簡單 | 因為共享進程數據,數據共享簡單,同步複雜 | 各有千秋 | |
佔用記憶體多,切換複雜,CPU利用率低 | 佔用記憶體少,切換簡單,CPU利用率高 | 多執行緒更好 | |
#建立銷毀、切換複雜,速度慢 | 建立銷毀、切換簡單,速度很快 | 多執行緒更好 | |
編碼簡單、調試方便 | 編碼、調試複雜 | ##編碼、調試複雜 | |
進程獨立運行,不會相互影響 | 線程同呼吸共命運 | 多進程更好 | |
可用於多機多核心分佈式,易於擴充 | 只能用於多核心分佈式 | #多進程更好 |
//api.js const Koa = require('koa'); const app = new Koa(); const {Worker} = require('worker_threads') app.use(async (ctx) => { const url = ctx.request.url; if (url === '/') { ctx.body = {name: 'xxx', age: 14} } if (url === '/compute') { const sum = await new Promise(resolve => { const worker = new Worker(__dirname+'/compute.js') //接收信息 worker.on('message', data => { resolve(data) }) }) ctx.body = {sum} } }) app.listen(4000, () => { console.log('http://localhost:4000/ start') }) //computer.js const {parentPort}=require('worker_threads') let sum=0 for (let i = 0; i <1000000000 ; i++) { sum+=i } //发送信息 parentPort.postMessage(sum)
worker_threadshttps://nodejs.org/dist/latest-v16.x/docs/api/worker_threads.html
採用多進程來解決上面程式碼的計算問題:
//api.js const Koa = require('koa'); const app = new Koa(); const {fork} = require('child_process') app.use(async (ctx) => { const url = ctx.request.url; if (url === '/') { ctx.body = {name: 'xxx', age: 14} } if (url === '/compute') { const sum = await new Promise(resolve => { const worker =fork(__dirname+'/compute.js') worker.on('message', data => { resolve(data) }) }) ctx.body = {sum} } }) app.listen(4000, () => { console.log('http://localhost:4000/ start') }) //computer.js let sum=0 for (let i = 0; i <1000000000 ; i++) { sum+=i } process.send(sum)
child_processnodejs 教學https://nodejs.org/dist/latest-v16.x/docs/api/child_process .html
更多node相關知識,請造訪:
以上是一文聊聊node的多進程和多線程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

C++中函數異常處理對於多執行緒環境特別重要,以確保執行緒安全性和資料完整性。透過try-catch語句,可以在出現異常時擷取和處理特定類型的異常,以防止程式崩潰或資料損壞。

PHP多執行緒是指在一個行程中同時執行多個任務,透過建立獨立運行的執行緒實作。 PHP中可以使用Pthreads擴充模擬多執行緒行為,安裝後可使用Thread類別建立和啟動執行緒。例如,處理大量資料時,可將資料分割為多個區塊,並建立對應數量的執行緒同時處理,提高效率。

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

使用Java函數的並發和多執行緒技術可以提升應用程式效能,包括以下步驟:理解並發和多執行緒概念。利用Java的並發和多執行緒函式庫,如ExecutorService和Callable。實作多執行緒矩陣乘法等案例,大幅縮短執行時間。享受並發和多執行緒帶來的應用程式響應速度提升和處理效率優化等優勢。

在多執行緒環境中使用JUnit時,有兩種常見方法:單執行緒測試和多執行緒測試。單執行緒測試在主執行緒上運行,避免並發問題,而多執行緒測試在工作執行緒上運行,需要同步測試方法來確保共享資源不受干擾。常見使用案例包括測試多執行緒安全方法,例如使用ConcurrentHashMap儲存鍵值對,並發執行緒對鍵值對進行操作並驗證其正確性,體現了多執行緒環境中JUnit的應用。

在多執行緒環境中,PHP函數的行為取決於其類型:普通函數:執行緒安全,可並發執行。修改全域變數的函數:不安全,需使用同步機制。文件操作函數:不安全,需使用同步機制協調存取。資料庫操作函數:不安全,需使用資料庫系統機制防止衝突。

C++中使用互斥量(mutex)處理多執行緒共享資源:透過std::mutex建立互斥量。使用mtx.lock()取得互斥量,對共享資源進行排他存取。使用mtx.unlock()釋放互斥。

在多執行緒環境中,C++記憶體管理面臨以下挑戰:資料競爭、死鎖和記憶體洩漏。因應措施包括:1.使用同步機制,如互斥鎖和原子變數;2.使用無鎖資料結構;3.使用智慧指標;4.(可選)實現垃圾回收。
