91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js中多進程模塊Cluster的介紹與使用

發布時間:2020-09-30 22:46:50 來源:腳本之家 閱讀:301 作者:黃明恩 欄目:web開發

前言

我們都知道nodejs最大的特點就是單進程、無阻塞運行,并且是異步事件驅動的。Nodejs的這些特性能夠很好的解決一些問題,例如在服務器開發中,并發的請求處理是個大問題,阻塞式的函數會導致資源浪費和時間延遲。通過事件注冊、異步函數,開發人員可以提高資源的利用率,性能也會改善。既然Node.js采用單進程、單線程模式,那么在如今多核硬件流行的環境中,單核性能出色的Nodejs如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Nodejs進程,利用某些通信機制來協調各項任務。目前,已經有不少第三方的Node.js多進程支持模塊發布,而NodeJS 0.6.x 以上的版本提供了一個cluster模塊 ,允許創建“共享同一個socket”的一組進程,用來分擔負載壓力。

本篇文章就基于該cluster模塊來講述Node.js在多核CPU下的編程。

Cluster模塊介紹

nodejs所提供的cluster模塊目前尚處于試驗階段,在v0.10.7的官方文檔上我們可以看到模塊的發布信息如下:

Stability: 1 - Experimental

關于該模塊的功能,源文檔描述如此“A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.” 其意就是:Node的示例以單進程的模式運行,有時為了充分利用多核系統的資源用戶需要運行一組Node進程來分擔負載。

Cluster用法介紹

首先貼出一段該模塊示例應用代碼,接下來進行詳細分析,代碼如下:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
 require('os').cpus().forEach(function(){
 cluster.fork();
 });
 cluster.on('exit', function(worker, code, signal) {
 console.log('worker ' + worker.process.pid + ' died');
 });
 cluster.on('listening', function(worker, address) { 
 console.log("A worker with #"+worker.id+" is now connected to " +
  address.address +
 ":" + address.port); 
 }); 
} else {
 http.createServer(function(req, res) {
 res.writeHead(200);
 res.end("hello world\n");
 console.log('Worker #' + cluster.worker.id + ' make a response');
 }).listen(8000);
}

這段代碼很簡單,主線程就是當前運行的js文件,主線程根據你本機系統的核數來創建子進程。所有進程共享一個監聽端口8000,當有請求發起時,主線程會將該請求隨機分配給某個子進程。console.log('Worker #' + cluster.worker.id + ' make a response');這句代碼可以打印出是哪個進程處理該請求。

問題分析

我們前面提到有請求發起時,由系統來決定將該請求交給哪個進程進行處理。這種完全依賴于系統的負載均衡存在著一個重要缺陷:在windows,linux和Solaris上,只要某個子進程的accept queue為空(通常為最后創建的那個子進程),系統就會將多個connetion分配到同一個子進程上,這會造成進程間負載極為不均衡。特別是在使用長連接的時候,單位時間內的new coming connection并不高,子進程的accept queue往往均為空,就會導致connection會不停的分配給同一個進程。所以這種負載均衡完全依賴于accept queue的空閑程度,只有在使用短連接,而且并發非常高的情況下,才能達到負載均衡,但是這個時候系統的load會非常高,系統也會變得不穩定起來。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石屏县| 丹棱县| 大关县| 菏泽市| 遂溪县| 恩施市| 武平县| 淮北市| 图们市| 册亨县| 巴东县| 宁化县| 甘肃省| 东源县| 滨海县| 大宁县| 海南省| 中西区| 孝昌县| 玉溪市| 江阴市| 宜阳县| 景泰县| 泊头市| 岳阳市| 黄冈市| 巫山县| 伊宁市| 乌什县| 昌吉市| 会理县| 安化县| 安阳县| 秦皇岛市| 陵水| 屯门区| 青川县| 兴国县| 五原县| 玛曲县| 高唐县|