溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

node可不可以開(kāi)啟多線程

發(fā)布時(shí)間:2022-06-16 10:07:01 來(lái)源:億速云 閱讀:174 作者:zzz 欄目:web開(kāi)發(fā)

本文小編為大家詳細(xì)介紹“node可不可以開(kāi)啟多線程”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“node可不可以開(kāi)啟多線程”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

node可以開(kāi)啟多線程;可以利用node自帶的“child_process”模塊來(lái)開(kāi)啟多線程,語(yǔ)法為“child_process.fork(modulePath[, args][, options])”;使用該模塊可以創(chuàng)建exec、execFile、spawn、fork四種類型的子進(jìn)程。

本教程操作環(huán)境:windows10系統(tǒng)、nodejs 12.19.0版本、Dell G3電腦。

node可以開(kāi)啟多線程嗎

node可以開(kāi)啟多線程

我們都知道 Node.js 是以單線程的模式運(yùn)行的,但它使用的是事件驅(qū)動(dòng)來(lái)處理并發(fā),基于事件驅(qū)動(dòng)、非阻塞I/O模型,充分利用操作系統(tǒng)提供的異步 I/O 進(jìn)行多任務(wù)的執(zhí)行,適合于 I/O 密集型的應(yīng)用場(chǎng)景,因?yàn)楫惒?,程序無(wú)需阻塞等待結(jié)果返回

NodeJS多線程的出現(xiàn)不為了提高并發(fā),而是為了充分提高CPU的利用率

開(kāi)多線程的幾種方式

使用Node自帶的 child_process 模塊

child_process.fork(modulePath[, args][, options])

衍生新的 Node.js 進(jìn)程并使用建立的 IPC 通信通道(其允許在父子進(jìn)程之間發(fā)送消息)調(diào)用指定的模塊

cluster 集群模塊可以輕松創(chuàng)建共享服務(wù)器端口的子進(jìn)程 ,工作進(jìn)程使用 child_process.fork() 方法衍生

node可不可以開(kāi)啟多線程

使用多進(jìn)程

express

新建三個(gè)文件 server.js(express服務(wù)) cluster.js(多線程服務(wù)文件)extensionServer.js (express 子服務(wù))
下面操作確保安裝 express

npm intsall express --seve-dev

extensionServer.js 使用express 創(chuàng)建 子服務(wù)
const express = require("express"), //Express框架
app = express();

// api 先關(guān)接口
app.all('/userinfo', (req, res) => {
  res.json({ name: '自夏', msg: '我在自夏 selfsummer' })
})

app.listen(4000, () => {
 console.log(`子服務(wù)啟動(dòng)成功`);
})
serve.js 先創(chuàng)建Express 多線程 服務(wù)
const  { fork } = require("child_process"),
express = require("express"), //Express框架
app = express();

const { pid, ppid } = require('process')

// api 先關(guān)接口
app.all('/123', (req, res, next) => {
   console.log(`本次進(jìn)程id為: ${pid}`);
  res.end(`本次進(jìn)程id為: ${pid}`)
})

app.all('/456', (req, res, next) => {
  console.log(`本次進(jìn)程id為: ${pid}`);
  res.end(`本次進(jìn)程id為: ${pid}`)
})


app.listen(3888, () => {
 console.log(`服務(wù)器端啟動(dòng)成功 父進(jìn)程 ${ppid} 當(dāng)前服務(wù)進(jìn)程id為 ${pid}`);
 // 開(kāi)啟多進(jìn)程
 fork('extensionServer.js')
})

module.exports = {
  app,
  express,
};

啟動(dòng)服務(wù) 這個(gè)時(shí)候主服務(wù)和自服務(wù)都啟動(dòng)好了

node可不可以開(kāi)啟多線程

訪問(wèn) Express 主服務(wù) 以及子服務(wù)地址都可成功

cluster.js 把Express 服務(wù)改為集群

使用 cluster集群模塊開(kāi)啟多線程

const os = require('os');
const cluster = require('cluster');
const { log } = console;
const express = require("express"); //Express框架

const app = express();
const processId = process.pid;

// 判斷當(dāng)前是否有主進(jìn)程
if (cluster.isMaster)
{
	// 獲取當(dāng)前本機(jī)cpu核數(shù),開(kāi)啟多線程
  const cpus = os.cpus().length;
  for (let i = 0; i < cpus; i++){
    cluster.fork()
  }
	//進(jìn)程已斷開(kāi)連接	
	  cluster.on('disconnect', (worker) => {
	    console.log(`進(jìn)程號(hào) #${worker.id} 已斷開(kāi)`);
	  });
	// 意外退出進(jìn)程
	cluster.on('exit', (worker, code, signal) => {
	      cluster.fork();
  	});


} else
{
	// 引用Express主服務(wù) 開(kāi)啟主進(jìn)程  
  require('./server')
}

啟動(dòng)集群服務(wù) node cluster

當(dāng)然也可以在集群里面繼續(xù)開(kāi)子進(jìn)程

訪問(wèn)二次(一個(gè)瀏覽器訪問(wèn),一個(gè)Postman 訪問(wèn))后接口
node可不可以開(kāi)啟多線程

為什么會(huì)有多個(gè) 服務(wù)器端啟動(dòng)成功 當(dāng)前服務(wù)進(jìn)程id為 xxx

應(yīng)為 cluster 模塊在 當(dāng)前主進(jìn)程下面衍生子進(jìn)程,每一個(gè)子進(jìn)程是基于主進(jìn)程的所有
衍生新的進(jìn)程,進(jìn)程之間是相互獨(dú)立的,每個(gè)進(jìn)程都有自己的 V8 實(shí)例、內(nèi)存,系統(tǒng)資源是有限的,不建議衍生太多的子進(jìn)程出來(lái),通長(zhǎng)根據(jù)系統(tǒng)*
CPU 核心數(shù)*設(shè)置

前面我們有判斷是否是有主進(jìn)程

如果有主進(jìn)程就 使用 cluster 模塊 開(kāi)啟 子進(jìn)程

沒(méi)有就開(kāi)啟進(jìn)程

把Express 服務(wù)改為 默認(rèn)http 服務(wù)

只需要更改server.js 文件內(nèi)容

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 `進(jìn)程${pid} 很高興為你服務(wù)`;
    case '/456':
      return `進(jìn)程${pid} 很高興為你服務(wù)`;
    default: return `沒(méi)有此接口`
  }}server.listen(3889, () => {
  console.log(`Server Started in process ${pid}`);})

依舊是啟動(dòng) cluster.js(多線程服務(wù)文件)
node可不可以開(kāi)啟多線程

讀到這里,這篇“node可不可以開(kāi)啟多線程”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI