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 模組在目前主進程下面衍生子進程,每一個子進程是基於主進程的所有#前面我們有判斷是否有主程序如果有主程序就使用cluster 模組開啟子程序沒有就開啟進程把Express 服務改為預設http服務只需要更改server.js 檔案內容衍生新的進程,進程之間是相互獨立的,每個行程都有自己的V8 實例、內存,系統資源是有限的,不建議衍生太多的子程序出來,通長根據系統*
CPU 核心數*設定
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}`);})
nodejs影片教學》
以上是node可以開啟多執行緒嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!