本文小編為大家詳細介紹“node可不可以開啟多線程”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當(dāng),希望這篇“node可不可以開啟多線程”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
成都創(chuàng)新互聯(lián)專注于永順企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城系統(tǒng)網(wǎng)站開發(fā)。永順網(wǎng)站建設(shè)公司,為永順等地區(qū)提供建站服務(wù)。全流程按需定制制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
node可以開啟多線程;可以利用node自帶的“child_process”模塊來開啟多線程,語法為“child_process.fork(modulePath[, args][, options])”;使用該模塊可以創(chuàng)建exec、execFile、spawn、fork四種類型的子進程。
本教程操作環(huán)境:windows10系統(tǒng)、nodejs 12.19.0版本、Dell G3電腦。
node可以開啟多線程
我們都知道 Node.js 是以單線程的模式運行的,但它使用的是事件驅(qū)動來處理并發(fā),基于事件驅(qū)動、非阻塞I/O模型,充分利用操作系統(tǒng)提供的異步 I/O 進行多任務(wù)的執(zhí)行,適合于 I/O 密集型的應(yīng)用場景,因為異步,程序無需阻塞等待結(jié)果返回
NodeJS多線程的出現(xiàn)不為了提高并發(fā),而是為了充分提高CPU的利用率
開多線程的幾種方式
使用Node自帶的 child_process 模塊
child_process.fork(modulePath[, args][, options])
衍生新的 Node.js 進程并使用建立的 IPC 通信通道(其允許在父子進程之間發(fā)送消息)調(diào)用指定的模塊
cluster集群模塊可以輕松創(chuàng)建共享服務(wù)器端口的子進程 ,工作進程使用 child_process.fork() 方法衍生

新建三個文件 server.js(express服務(wù)) cluster.js(多線程服務(wù)文件)extensionServer.js (express 子服務(wù))
下面操作確保安裝 express
npm intsall express --seve-dev
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ù)啟動成功`);
})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(`本次進程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(`服務(wù)器端啟動成功 父進程 ${ppid} 當(dāng)前服務(wù)進程id為 ${pid}`);
// 開啟多進程
fork('extensionServer.js')
})
module.exports = {
app,
express,
};啟動服務(wù) 這個時候主服務(wù)和自服務(wù)都啟動好了

訪問 Express 主服務(wù) 以及子服務(wù)地址都可成功
使用 cluster集群模塊開啟多線程
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)前是否有主進程
if (cluster.isMaster)
{
// 獲取當(dāng)前本機cpu核數(shù),開啟多線程
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主服務(wù) 開啟主進程
require('./server')
}啟動集群服務(wù) node cluster
當(dāng)然也可以在集群里面繼續(xù)開子進程
訪問二次(一個瀏覽器訪問,一個Postman 訪問)后接口
為什么會有多個 服務(wù)器端啟動成功 當(dāng)前服務(wù)進程id為 xxx
應(yīng)為 cluster 模塊在 當(dāng)前主進程下面衍生子進程,每一個子進程是基于主進程的所有
衍生新的進程,進程之間是相互獨立的,每個進程都有自己的 V8 實例、內(nèi)存,系統(tǒng)資源是有限的,不建議衍生太多的子進程出來,通長根據(jù)系統(tǒng)*
CPU 核心數(shù)*設(shè)置
前面我們有判斷是否是有主進程
如果有主進程就 使用 cluster 模塊 開啟 子進程
沒有就開啟進程
只需要更改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 `進程${pid} 很高興為你服務(wù)`;
case '/456':
return `進程${pid} 很高興為你服務(wù)`;
default: return `沒有此接口`
}}server.listen(3889, () => {
console.log(`Server Started in process ${pid}`);})依舊是啟動 cluster.js(多線程服務(wù)文件)
讀到這里,這篇“node可不可以開啟多線程”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享題目:node可不可以開啟多線程
文章來源:http://chinadenli.net/article48/isggep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站維護、網(wǎng)站內(nèi)鏈、面包屑導(dǎo)航、網(wǎng)站導(dǎo)航、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)