node可以開啟多執行緒嗎

2022-06-15 18:00:38

node可以開啟多執行緒;可以利用node自帶的「child_process」模組來開啟多執行緒,語法為「child_process.fork(modulePath[, args][, options])」;使用該模組可以建立exec、execFile、spawn、fork四種型別的子程序。

本教學操作環境:windows10系統、nodejs 12.19.0版本、Dell G3電腦。

node可以開啟多執行緒嗎

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() 方法衍生

在這裡插入圖片描述

使用多程序

express

新建三個檔案 server.js(express服務) cluster.js(多執行緒服務檔案)extensionServer.js (express 子服務)
下面操作確保安裝 express

npm intsall express --seve-dev

extensionServer.js 使用express 建立 子服務

const express = require("express"), //Express框架
app = express();

// api 先關介面
app.all('/userinfo', (req, res) => {
  res.json({ name: '自夏', msg: '我在自夏 selfsummer' })
})

app.listen(4000, () => {
 console.log(`子服務啟動成功`);
})

serve.js 先建立Express 多執行緒 服務

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.js 把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 模組 開啟 子程序

沒有就開啟程序

把Express 服務改為 預設http 服務

只需要更改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其它相關文章!