自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

運維 系統(tǒng)運維
在本文中,我們將會用 Node.js 實現(xiàn)一個 ExpressJS HTTP 服務器,并在每個 CPU 內(nèi)核上創(chuàng)建一個唯一的實例。

介紹

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

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

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

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

創(chuàng)建 Express HTTP 服務器

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

我們將用 ExpressJS 來快速創(chuàng)建一個高效而簡單的服務器。如果尚未安裝 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 軟件包。

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

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

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

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

很好!現(xiàn)在我們啟動 Express HTTP 服務器。

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

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

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

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

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

這是完整的代碼:

  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。

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

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

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

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

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

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

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

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

  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 

輸出將根據(jù) CPU 核的數(shù)量而有所不同。

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

總結(jié)

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

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

 

責任編輯:趙寧寧 來源: 前端先鋒
相關(guān)推薦

2011-04-25 17:47:57

傳真機

2009-09-01 09:06:08

并行編程

2013-01-18 14:02:46

VDI存儲IOPS

2021-06-02 13:17:42

物聯(lián)網(wǎng)IOT

2010-05-06 12:44:13

Unix系統(tǒng)

2024-10-28 15:14:53

2017-01-04 15:42:43

運營商SDN服務保障

2023-10-23 16:11:14

2009-05-21 09:08:52

接口C++面向?qū)ο?/a>

2019-06-13 19:20:38

云平臺遷移云計算

2018-09-04 08:40:41

數(shù)據(jù)中心網(wǎng)絡機柜

2015-02-26 09:50:42

vSphereSSD

2013-03-22 10:30:16

IT主管ITM云計算

2019-05-05 09:26:01

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)投資物聯(lián)網(wǎng)

2015-01-08 10:20:13

私有云公有云云管理

2020-08-18 09:03:06

云計算云存儲數(shù)據(jù)

2015-06-04 09:12:05

云安全

2013-07-25 09:20:32

Windows 8.1

2023-09-05 14:58:23

大數(shù)據(jù)

2024-04-12 14:46:33

人工智能醫(yī)療保健
點贊
收藏

51CTO技術(shù)棧公眾號