欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何利用Nodejs構(gòu)建多進程應(yīng)用

 更新時間:2022年10月18日 14:46:55   作者:SaraiNoQ  
這篇文章主要為大家介紹了如何利用Nodejs構(gòu)建多進程應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

JavaScript 主線程運行在單個進程的單個線程上。這樣做的好處是:

  • 程序狀態(tài)是單一的,在沒有多線程的情況下沒有鎖、線程同步問題,
  • 操作系統(tǒng)在調(diào)度時因為較少上下文的切換,可以很好地提高CPU的使用率。

但是單進程單線程并非完美的結(jié)構(gòu),一旦線程中某段代碼發(fā)生異常阻塞,會阻塞代碼執(zhí)行而浪費資源。同時,如今CPU基本均是多核的,服務(wù)器往往還有多個CPU。

因此 Nodejs 不可避免的面臨兩個問題:如何充分利用多核CPU ****和 ****如何保證進程的健壯性和穩(wěn)定性 。 另外,由于 Nodejs 中所有處理都在單線程上進行,影響事件驅(qū)動服務(wù)模型性能的點在于CPU的計算能力,而不受多進程或多線程模式中資源上限的影響,可伸縮性遠比前兩者高。如果解決掉多核CPU的利用問題,帶來的性能上提升是可觀的。

進程的創(chuàng)建和使用

多核利用率

面對單進程單線程對多核使用不足的問題,最簡單的方法是啟動多進程即可。理想狀態(tài)下每個進程各自利用一個CPU,以此實現(xiàn)多核CPU的利用。Nodejs 提供了 child_process模塊,并且也提供了child_process.fork() 方法幫助我們實現(xiàn)進程的復(fù)制。

你可以通過這個方法在本地啟動多個 HTTP 服務(wù),首先編寫一段創(chuàng)建 http服務(wù)端 的代碼:

const http = require("http");
const server = http.createServer((req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain"
  });
  res.end("hello,world!");
});
// 隨機監(jiān)聽1000-1999的任意一個端口
server.listen(Math.floor((1 + Math.random()) * 1000));

然后創(chuàng)建一個主進程 master.js 來啟動和管理他們:

const fork = require("child_process").fork;
const cpus = require("os").cpus();
console.log(cpus.length);
for (let i = 0; i < cpus.length; i++) {
  fork('./server.js');
}

?? 在 Linux 系統(tǒng)中,你可以通過 ps aux | grep worker.js 來直接查看,在 Windows 中,你能通過 netstat -a 然后查看 1000-1999 端口的進程。

這樣的模式稱為 Master-Worker模式,又稱 主從模式。如圖,進程分為兩種:主進程和工作進程。這是典型的分布式架構(gòu)中用于并行處理業(yè)務(wù)的模式,具備較好的可伸縮性和穩(wěn)定性:

  • 主進程不負責具體的業(yè)務(wù)處理,而是負責調(diào)度或管理工作進程,它是趨向于穩(wěn)定的。
  • 工作進程負責具體的業(yè)務(wù)處理,趨于不穩(wěn)定。

?? fork() 能讓我們復(fù)制進程使每個CPU內(nèi)核都使用上,但是依然要切記 fork() 進程是昂貴的。因為Node通過事件驅(qū)動和異步IO的方式很大的緩解了并發(fā)問題,所以這里啟動多個進程只是為了充分將CPU資源利用起來,而不是為了解決并發(fā)問題。

創(chuàng)建子進程

child_process模塊 給予 Node 可以隨意創(chuàng)建子進程(child_process)的能力。它提供了4個方法用于創(chuàng)建子進程:

  • spawn():啟動一個子進程來執(zhí)行命令。
  • exec():啟動一個子進程來執(zhí)行命令。與spawn()不同的是其接口不同,它有一個回調(diào)函數(shù)獲知子進程的狀況。
  • execFile():啟動一個子進程來執(zhí)行可執(zhí)行文件。
  • fork():與 spawn() 類似,不同點在于它創(chuàng)建 Node 的子進程只需指定要執(zhí)行的 JavaScript 文件模塊即可。
const cp = require("child_process");
cp.spawn("node", ["./server.js"]);
cp.exec("node server.js", (err, stdout, stderr) => {
  // TODO
});
cp.execFile("server.js", (err, stdout, stderr) => {
  // TODO
});
cp.fork('./server.js');

?? execFile() 只能用于可以直接執(zhí)行的文件。在 Linux 中,你可以在文件開頭加入 #! /usr/bin/env node

進程間通信 IPC

Master-Worker模式 中,要實現(xiàn)主進程管理和調(diào)度工作進程的功能,需要主進程和工作進程之間的通信。子進程對象則由 send() 方法實現(xiàn)主進程向子進程發(fā)送數(shù)據(jù),message事件 實現(xiàn)收聽子進程發(fā)來的數(shù)據(jù):

// parent.js
const cp = require("child_process");
const n = cp.fork("./child.js");
n.on('message', (msg) => {
  console.log('parent got msg: ', msg);
});
n.send({
  s: 'hello, world',
});
// child.js
process.on('message', (msg) => {
  console.log('child got msg', msg);
});
process.send({
  b: 'bar',
});

?? HTML5提出了 WebWorker API 來創(chuàng)建工作線程,而主進程和工作進程之間通過 onmessage()postMessage() 進行通信。具體參考MDN文檔

通過 fork() 或者其他API,創(chuàng)建子進程之后,為了實現(xiàn)父子進程之間的通信,父進程與子進程之間將會創(chuàng)建IPC通道(Inter-Process Communication,即進程間通信) 。通過IPC通道,父子進程之間才能通過message和send()傳遞消息。

父進程在實際創(chuàng)建子進程之前,會創(chuàng)建IPC通道并監(jiān)聽它,然后才真正創(chuàng)建出子進程,并通過環(huán)境變量(NODE_CHANNEL_FD)告訴子進程這個IPC通道的文件描述符。子進程在啟動的過程中,根據(jù)文件描述符去連接這個已存在的IPC通道,從而完成父子進程之間的連接。

?? 只有啟動的子進程是Node進程時,子進程才會根據(jù)環(huán)境變量去連接IPC通道。對于其他類型的子進程則無法實現(xiàn)進程間通信,除非其他進程也按約定去連接這個已經(jīng)創(chuàng)建好的IPC通道

總結(jié)

今天我們討論了 Nodejs 在多核利用方法的問題,然后介紹了創(chuàng)建子進程、進程間通信與IPC通道的內(nèi)容。通過這些基礎(chǔ)技術(shù),用 child_process模塊 在單機上搭建 Nodejs集群 是件相對容易的事情,讓 Nodejs 能夠在多核CPU的環(huán)境下充分利用計算資源。

以上就是詳解如何利用Nodejs構(gòu)建多進程應(yīng)用的詳細內(nèi)容,更多關(guān)于Nodejs構(gòu)建多進程應(yīng)用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vscode安裝教程以及配置node.js環(huán)境全過程

    vscode安裝教程以及配置node.js環(huán)境全過程

    這篇文章主要給大家介紹了關(guān)于vscode安裝教程以及配置node.js環(huán)境的相關(guān)資料,VSCode是一款由微軟開發(fā)的輕量級編輯器,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 利用NPM淘寶的node.js鏡像加速nvm

    利用NPM淘寶的node.js鏡像加速nvm

    這篇文章主要介紹了利用NPM淘寶的node.js鏡像加速nvm的相關(guān)資料,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • node.js中的fs.renameSync方法使用說明

    node.js中的fs.renameSync方法使用說明

    這篇文章主要介紹了node.js中的fs.renameSync方法使用說明,本文介紹了fs.renameSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Koa2 之文件上傳下載的示例代碼

    Koa2 之文件上傳下載的示例代碼

    本篇文章主要介紹了Koa2 之文件上傳下載的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • nodejs通過phantomjs實現(xiàn)下載網(wǎng)頁

    nodejs通過phantomjs實現(xiàn)下載網(wǎng)頁

    這篇文章主要介紹了nodejs通過phantomjs實現(xiàn)下載網(wǎng)頁的方法,有需要的小伙伴可以參考下。
    2015-05-05
  • 淺談在koa2中實現(xiàn)頁面渲染的全局數(shù)據(jù)

    淺談在koa2中實現(xiàn)頁面渲染的全局數(shù)據(jù)

    本篇文章主要介紹了淺談在koa2中實現(xiàn)頁面渲染的全局數(shù)據(jù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node.js如何使用Diffie-Hellman密鑰交換算法詳解

    Node.js如何使用Diffie-Hellman密鑰交換算法詳解

    Deffie-Hellman(簡稱 DH) 密鑰交換是最早的密鑰交換算法之一,它使得通信的雙方能在非安全的信道中安全的交換密鑰,用于加密后續(xù)的通信消息。下面這篇文章主要給大家介紹了關(guān)于Node.js如何使用DiffieHellman密鑰交換算法的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Zabbix添加Node.js監(jiān)控的方法

    Zabbix添加Node.js監(jiān)控的方法

    這篇文章主要介紹了Zabbix添加Node.js監(jiān)控的方法,非常不錯具有一定的參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Nodejs 中文分詞常用模塊用法分析

    Nodejs 中文分詞常用模塊用法分析

    這篇文章主要介紹了Nodejs 中文分詞常用模塊用法,結(jié)合具體案例形式分析了node.js常用分詞模塊的基本功能、用法、效率與相關(guān)使用特點,需要的朋友可以參考下
    2023-05-05
  • node.js [superAgent] 請求使用示例

    node.js [superAgent] 請求使用示例

    這篇文章主要介紹了node.js [superAgent] 請求使用示例,分別給大家匯總了post請求、get請求、delete請求和put請求的示例,推薦給大家,希望大家能夠喜歡。
    2015-03-03

最新評論