node可以開啟多執行緒嗎

WBOY
發布: 2022-06-15 17:06:37
原創
2967 人瀏覽過

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

node可以開啟多執行緒嗎

本教學操作環境: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() 方法衍生

node可以開啟多執行緒嗎

使用多進程

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,
};
登入後複製

啟動服務這個時候主服務和自服務都啟動好了

node可以開啟多執行緒嗎

#存取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(&#39;disconnect&#39;, (worker) => {
	    console.log(`进程号 #${worker.id} 已断开`);
	  });
	// 意外退出进程
	cluster.on(&#39;exit&#39;, (worker, code, signal) => {
	      cluster.fork();
  	});


} else
{
	// 引用Express主服务 开启主进程  
  require(&#39;./server&#39;)
}
登入後複製

啟動叢集服務node cluster

##當然也可以在叢集裡面繼續開子行程

訪問二次(一個瀏覽器訪問,一個Postman 訪問)後接口


node可以開啟多執行緒嗎

#為什麼會有多個

伺服器端啟動成功當前服務進程id為xxx

應該是cluster 模組在目前主進程下面衍生子進程,每一個子進程是基於主進程的所有

衍生新的進程,進程之間是相互獨立的,每個行程都有自己的V8 實例、內存,系統資源是有限的,不建議衍生太多的子程序出來,通長根據系統*
CPU 核心數*設定

#前面我們有判斷是否有主程序

如果有主程序就使用cluster 模組開啟子程序

沒有就開啟進程

把Express 服務改為預設http服務

只需要更改server.js 檔案內容

const http = require(&#39;http&#39;)const { pid, ppid } = require(&#39;process&#39;)const server = http.createServer((req, res) => {
  res.end(router(req.url))})const router = (url) => {
  switch (url)
  {
    case &#39;/132&#39;:
      return `进程${pid} 很高兴为你服务`;
    case &#39;/456&#39;:
      return `进程${pid} 很高兴为你服务`;
    default: return `没有此接口`
  }}server.listen(3889, () => {
  console.log(`Server Started in process ${pid}`);})
登入後複製
依舊是啟動cluster.js(多執行緒服務檔案)


node可以開啟多執行緒嗎

推薦學習:《

nodejs影片教學

以上是node可以開啟多執行緒嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板