node可以開啟多執行緒;可以利用node自帶的「child_process」模組來開啟多執行緒,語法為「child_process.fork(modulePath[, args][, options])」;使用該模組可以建立exec、execFile、spawn、fork四種型別的子程序。
本教學操作環境:windows10系統、nodejs 12.19.0版本、Dell G3電腦。
node可以開啟多執行緒
我們都知道 Node.js 是以單執行緒的模式執行的,但它使用的是事件驅動來處理並行,基於事件驅動、非阻塞I/O模型,充分利用作業系統提供的非同步 I/O 進行多工的執行,適合於 I/O 密集型的應用場景,因為非同步,程式無需阻塞等待結果返回
NodeJS多執行緒的出現不為了提高並行,而是為了充分提高CPU的利用率
開多執行緒的幾種方式
使用Node自帶的 child_process 模組
child_process.fork(modulePath[, args][, options])
衍生新的 Node.js 程序並使用建立的 IPC 通訊通道(其允許在父子程序之間傳送訊息)呼叫指定的模組
cluster 叢集模組可以輕鬆建立共用伺服器埠的子程序 ,工作程序使用 child_process.fork() 方法衍生
新建三個檔案 server.js(express服務) cluster.js(多執行緒服務檔案)extensionServer.js (express 子服務)
下面操作確保安裝 express
npm intsall express --seve-dev
const express = require("express"), //Express框架 app = express(); // api 先關介面 app.all('/userinfo', (req, res) => { res.json({ name: '自夏', msg: '我在自夏 selfsummer' }) }) app.listen(4000, () => { console.log(`子服務啟動成功`); })
const { fork } = require("child_process"), express = require("express"), //Express框架 app = express(); const { pid, ppid } = require('process') // api 先關介面 app.all('/123', (req, res, next) => { console.log(`本次程序id為: ${pid}`); res.end(`本次程序id為: ${pid}`) }) app.all('/456', (req, res, next) => { console.log(`本次程序id為: ${pid}`); res.end(`本次程序id為: ${pid}`) }) app.listen(3888, () => { console.log(`伺服器端啟動成功 父程序 ${ppid} 當前服務程序id為 ${pid}`); // 開啟多程序 fork('extensionServer.js') }) module.exports = { app, express, };
啟動服務 這個時候主服務和自服務都啟動好了
存取 Express 主服務 以及子服務地址都可成功
使用 cluster叢集模組開啟多執行緒
const os = require('os'); const cluster = require('cluster'); const { log } = console; const express = require("express"); //Express框架 const app = express(); const processId = process.pid; // 判斷當前是否有主程序 if (cluster.isMaster) { // 獲取當前本機cpu核數,開啟多執行緒 const cpus = os.cpus().length; for (let i = 0; i < cpus; i++){ cluster.fork() } //程序已斷開連線 cluster.on('disconnect', (worker) => { console.log(`程序號 #${worker.id} 已斷開`); }); // 意外退出程序 cluster.on('exit', (worker, code, signal) => { cluster.fork(); }); } else { // 參照Express主服務 開啟主程序 require('./server') }
啟動叢集服務 node cluster
當然也可以在叢集裡面繼續開子程序
存取二次(一個瀏覽器存取,一個Postman 存取)後介面
為什麼會有多個 伺服器端啟動成功 當前服務程序id為 xxx
應為 cluster 模組在 當前主程序下面衍生子程序,每一個子程序是基於主程序的所有
衍生新的程序,程序之間是相互獨立的,每個程序都有自己的 V8 範例、記憶體,系統資源是有限的,不建議衍生太多的子程序出來,通長根據系統*
CPU 核心數*設定
前面我們有判斷是否是有主程序
如果有主程序就 使用 cluster 模組 開啟 子程序
沒有就開啟程序
只需要更改server.js 檔案內容
const http = require('http')const { pid, ppid } = require('process')const server = http.createServer((req, res) => { res.end(router(req.url))})const router = (url) => { switch (url) { case '/132': return `程序${pid} 很高興為你服務`; case '/456': return `程序${pid} 很高興為你服務`; default: return `沒有此介面` }}server.listen(3889, () => { console.log(`Server Started in process ${pid}`);})
依舊是啟動 cluster.js(多執行緒服務檔案)
推薦學習:《》
以上就是node可以開啟多執行緒嗎的詳細內容,更多請關注TW511.COM其它相關文章!