成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

怎樣用 NodeJS 充分利用多核 CPU 的資源

運維 系統運維
在本文中,我們將會用 Node.js 實現一個 ExpressJS HTTP 服務器,并在每個 CPU 內核上創建一個唯一的實例。

介紹

單個 Node.js 程序的實例僅在一個線程上運行,因此無法充分利用 CPU 的多核系統。有時你可能需要啟動 Node.js 進程集群來利用本地計算機或生產服務器上的每個 CPU 內核。

在處理 API 或基于 ExpressJS 的HTTP服務器時,這個問題尤其重要。

幸運的是,Node.js 有一個名為 Cluster 的核心模塊,它能夠幫助我們在 CPU 的所有核心上運行 Node.js 程序。

在本文中,我們將會用 Node.js 實現一個 ExpressJS HTTP 服務器,并在每個 CPU 內核上創建一個唯一的實例。這樣,由于每個其CPU 核心實例都會提供可能的并發請求數,因此 HTTP 服務器的吞吐量將會大大增加。

創建 Express HTTP 服務器

我們要做的第一件事是啟動并運行 HTTP 服務器。如果你已經有了一個可用的 ExpressJS 服務器,則可以跳至下一部分:在多核 CPU 上運行服務器。

我們將用 ExpressJS 來快速創建一個高效而簡單的服務器。如果尚未安裝 npm 軟件包,則可以用以下命令進行安裝:

  1. $ npm install --save express 

然后把下面的代碼添加到要你的的 Node.js 文件中:

  1. const express = require("express") 
  2. const PORT = process.env.PORT || 5000 
  3. const app = express() 
  4. app.listen(PORT, function () { 
  5.   console.log(`Express server listening on port ${PORT}`) 
  6. }) 

首先,我們 require() 先前安裝的 Express npm 軟件包。

然后,我們創建一個 PORT 變量,該變量可以是當前的 process.env.PORT 的值,也可以是 5000。然后用express() 方法創建一個 express 實例,并將其保存在 app 變量中。

最添加 app.listen() 函數,用于啟動 Express 程序,并告訴它偵聽我們指定的 PORT。

通過命令行運行代碼時,應該看到類似的內容輸出到控制臺:

  1. Output: 
  2. Express server listening on port 5000 

很好!現在我們啟動 Express HTTP 服務器。

在多個 CPU 核心上運行服務器

在本節中,我們會把 Express 服務器運行在 CPU 的多個核心上!

為了幫助我們實現這一目標,我們將使用Node.js模塊 OS 和 Cluster 。用 OS 模塊來檢測系統有多少個 CPU 核,用 Cluster 模塊來創建多個子進程,我們的 HTTP 服務器可以并行運行這些子進程。

由于這些是核心模塊,因此不需要安裝任何 npm 包,并且可以將它們 require()到我們的代碼中。

我將為你提供完整的代碼,并在隨后進行解釋,因此,如果你看得一頭霧水,也沒有關系。

這是完整的代碼:

  1. const express = require("express") 
  2. const os = require("os") 
  3. const cluster = require("cluster") 
  4.  
  5. const PORT = process.env.PORT || 5000 
  6.  
  7. const clusterWorkerSize = os.cpus().length 
  8.  
  9. if (clusterWorkerSize > 1) { 
  10.   if (cluster.isMaster) { 
  11.     for (let i=0; i < clusterWorkerSize; i++) { 
  12.       cluster.fork() 
  13.     } 
  14.     cluster.on("exit", function(worker) { 
  15.       console.log("Worker", worker.id, " has exitted.") 
  16.     }) 
  17.   } else { 
  18.     const app = express() 
  19.     app.listen(PORT, function () { 
  20.       console.log(`Express server listening on port ${PORT} and worker ${process.pid}`) 
  21.     }) 
  22.   } 
  23. } else { 
  24.   const app = express() 
  25.   app.listen(PORT, function () { 
  26.     console.log(`Express server listening on port ${PORT} with the single worker ${process.pid}`) 
  27.   }) 

代碼中做了很多事情,所以讓我們解釋它的每一個部分。

首先是 require() express 包以及 Node.js 的兩個核心模塊 os 和 cluster。

接下來,創建一個 PORT 變量,并為其分配當前 process.env.PORT 編號或 5000的值。我們稍后將在啟動時用到它。

然后,我們創建一個名為 clusterWorkerSize 的變量來表示系統的 CPU 數量??梢杂? os.cpus().length方法獲得這個數字。有關 os.cpus() 方法的更多信息可查看 Node.js 文檔。

我們創建一個了 if...else語句,用 clusterWorkerSize 值檢查 CPU 是否有多個核。如果 CPU 數量大于 1,我們就繼續創建集群。但是如果運行代碼的計算機上只有一個 CPU 核心,則以本教程第一步中的方式啟動 Express 程序。

假設我們的機器有多個 CPU 核心,那么就要創建另一個 if...else 語句,檢查該語句是否為集群中已運行的第一個進程。用 cluster.isMaster() 方法檢查是否返回 true或 false。

如果是第一個運行的進程,我們將用 cluster.fork() 為計算機上的每個 CPU 核產生一個新的工作進程。我們還添加了一個事件偵聽器,該偵聽器將在工作進程退出時輸出一條消息,以便我們知道何時出現問題或意外。

值得注意的是,主進程用于偵聽 HTTP 服務器的端口,并在工作進程之間平衡所有請求的負載。

產生所有工作進程后,我們將在創建的每個工作進程上創建一個程序的新實例。如果你的計算機有 2 個 CPU 核,則將會創建該程序的 2 個實例。

運行程序時,應該能夠在控制臺上看到以下內容:

  1. Output: 
  2.  
  3. Express server listening on port 5000 and worker 10801 
  4. Express server listening on port 5000 and worker 10802 
  5. Express server listening on port 5000 and worker 10803 
  6. Express server listening on port 5000 and worker 10804 

輸出將根據 CPU 核的數量而有所不同。

現在你有了一個能夠在多核 CPU 上運行的 HTTP 服務器!

總結

cluster 模塊使我們能夠輕松創建子進程,從而為 Node.js 提供了使用 CPU 所提供的全部功能所急需的功能。并且它還在后臺為在主進程和工作進程之間進行通信做了大量工作。

在讀完本文之后,你現在應該知道該如何使用這個模塊在多個 CPU 核心上運行 Express HTTP 服務器。有了這些知識,你將能夠更好地管理和擴展你的應用。

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2011-04-25 17:47:57

傳真機

2013-01-18 14:02:46

VDI存儲IOPS

2009-09-01 09:06:08

并行編程

2021-06-02 13:17:42

物聯網IOT

2010-05-06 12:44:13

Unix系統

2024-10-28 15:14:53

2023-10-23 16:11:14

2017-01-04 15:42:43

運營商SDN服務保障

2009-05-21 09:08:52

接口C++面向對象

2019-06-13 19:20:38

云平臺遷移云計算

2015-06-04 09:12:05

云安全

2020-08-18 09:03:06

云計算云存儲數據

2018-09-04 08:40:41

數據中心網絡機柜

2015-02-26 09:50:42

vSphereSSD

2019-05-05 09:26:01

物聯網安全物聯網投資物聯網

2013-03-22 10:30:16

IT主管ITM云計算

2013-07-25 09:20:32

Windows 8.1

2015-01-08 10:20:13

私有云公有云云管理

2023-09-01 11:38:36

2019-08-06 09:52:16

網絡工具數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99re视频 | 国产综合区 | 鲁大师一区影视 | 免费永久av| 亚洲精品视频免费观看 | 一级aaaaaa毛片免费同男同女 | 欧美日韩精品一区二区三区四区 | 皇色视频在线 | 亚洲欧美日韩在线一区二区 | 亚洲性视频 | 久久综合一区二区三区 | 青青久草 | 日本在线小视频 | 亚洲国产精品久久久久秋霞不卡 | 欧美日韩综合精品 | www国产亚洲精品久久网站 | 免费在线黄色av | 成人在线免费观看 | 国产小视频在线 | 日韩成人久久 | 久久综合一区 | 国产精品高潮呻吟久久aⅴ码 | 成人欧美日韩一区二区三区 | 亚洲国产精品福利 | 欧美小视频在线观看 | 国产美女在线看 | 黄瓜av| 欧美亚洲国产一区二区三区 | 日韩欧美中文字幕在线观看 | 国产成人在线视频 | 成人精品视频在线观看 | 亚洲精品福利在线 | 色站综合| 国际精品久久 | 天天操天天射天天舔 | 日韩高清黄色 | 一级a性色生活片久久毛片 一级特黄a大片 | 波波电影院一区二区三区 | 国产精品久久久久久久久久久久 | 亚洲成人av | 亚洲三区视频 |