最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js使用cluster實現(xiàn)多進程

 更新時間:2024年07月02日 16:38:46   投稿:hebedich  
本文給大家詳細介紹了nodejs使用cluster模塊實現(xiàn)多進程的方法和步奏,非常的細致全面,有需要的小伙伴可以參考下

首先鄭重聲明:

nodeJS 是一門單線程!異步!非阻塞語言!
nodeJS 是一門單線程!異步!非阻塞語言!
nodeJS 是一門單線程!異步!非阻塞語言!

重要的事情說3遍。 因為nodeJS天生自帶buff, 所以從一出生就受到 萬千 粉絲的追捧, 但是,php 竟然嘲笑 我大NodeJS 的性能。 說不穩(wěn)定,不可靠,只能利用單核CPU。 辣雞 nodeJS.

搞mo shi~

但,大哥就是大哥,nodeJS在v0.8 的時候就已經(jīng)加入了cluster的模塊。 完全打臉php. 雖然,現(xiàn)在php 也開始抄襲nodeJS, 退出php7, 但是,你就只會抄...
233333
對不起啊,上面是我自已想的一段~ 以上內(nèi)容,純屬調(diào)侃,如果雷同,純屬巧合。

Ok~ 我們來正式介紹一下nodeJS的多進程吧~

cluster的前世今生

以前,由于cluster 本身的不完善,可能由于多方面原因吧,實現(xiàn)性能不好。 結果是,pm2 包的 崛起。 輕松使用一個pm2 就可以開啟多進程,實現(xiàn)負載均衡的效果。

pm2 start app.js

pm2的內(nèi)部和cluster內(nèi)部實現(xiàn)其實是一個道理,都是封裝了一層child_process--fork. 而child_process--fork 則是封裝了unix 系統(tǒng)的fork 方法。 既然,都到這了,我們來看看官方給出的解釋吧。

fork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is referred to as the parent process.

The child process and the parent process run in separate memory spaces. At the time of fork() both memory spaces have the same content. Memory writes, file mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the processes do not affect the other.

俺來翻譯一下,fork其實就是創(chuàng)建子進程的方法,新創(chuàng)建的進程被認為是子進程,而調(diào)用fork的進程則是父進程。 子進程和父進程本來是在獨立的內(nèi)存空間中的。但當你使用了fork之后,兩者就處在同一個作用域內(nèi)了。 但是,內(nèi)存的讀寫,文件的map,都不會影響對方。

上面那段的意思就是,你創(chuàng)建的進程其實可以相互通信,并且被master進程 管理。

看圖~~~

其實就是這個意思。

Ok~ 這只是系統(tǒng)創(chuàng)建子進程的模型。那么在NodeJs中是怎樣實現(xiàn)進程之間的交互的呢?
很簡單監(jiān)聽端口唄。。。

但是,實現(xiàn)通信不是很難,關鍵在于如果分配請求,這一點nodeJS 踩的坑確實很大。

nodeJS 實現(xiàn)進程分配的黑歷史

long time ago

nodeJS的master 開始并不是上帝, 他只是一個小小的臣子,他只會默默的看著幾個worker小皇帝相互爭奪,如果某個worker勝出,則其他的worker也就草草了事,等下一個請求過來。所以說,每來一次請求,都會引起一場腥風血雨。而,我們體會最深的就是驚群現(xiàn)象,即,CPU爆表.

借用TJ大神的一幅圖,說明一下。

這里,master只是綁定端口,而不會對來的請求做任何處理。 通過將socket的fd給fork出來的進程。造成的結果就是4個人男人(worker)搶一個妃子(request). 那場面別提有多血腥了。

前面說過,cluster其實就是對child_process的一層封裝,那我們繼續(xù)往底層走一點。實現(xiàn)cluster多進程。 首先,我們需要了解,這幾個模塊的基本用法。net,child_process.

child_process

這個應該是nodeJS 進程最核心的模塊。 基本的方法,有幾個,不過我這里,只介紹比較核心的:spawn ,fork ,exec。如果大家有興趣,可以去child_process參考.

child_process.spawn(command, args)

該方法用來運行指定的程序。比如: node app.js.他是異步的命令,但不支持callback, 不過我們可以使用process.on來監(jiān)聽結果。 他自帶3個參數(shù).

command: 執(zhí)行命令
args[Array]: 命令所帶的參數(shù)
options[Object]: 環(huán)境變量對象

OK~ 我們舉個一個簡單的demo: 試一試運行 touch apawn.js

const spawn = require('child_process').spawn;
const touch = spawn('touch',['spawn.js']);

touch.stdout.on('data', (data) => {
 console.log(`stdout: ${data}`);
});

touch.stderr.on('data', (data) => {
 console.log(`stderr: ${data}`);
});

touch.on('close', (code) => {
 console.log(`child process exited with code $[code]`);
});

如果,正確的話,應該會輸
child process exited with code 0. 然后運行目錄會生成pawn.js文件。 當然,如果你需要運行多參數(shù)的命令的話這就有點頭疼了。
所以,nodeJS 使用了exec對其進行很好的封裝,而且他支持回調(diào)函數(shù),這比較能夠讓我們理解。

child_process.exec(order,cb(err[,stdout,stderr]));

order: 就是你執(zhí)行的命令. 比如: rm spawn.js
cb: 就是命令執(zhí)行成功后的回調(diào)函數(shù)。

const childProcess = require('child_process');

const ls = childProcess.exec('rm spawn.js', function (error, stdout, stderr) {
  if (error) {
   console.log(error.stack);
   console.log('Error code: '+error.code);
  }
  console.log('Child Process STDOUT: '+stdout);
});

正常情況下會刪除spawn.js文件。

上面兩個只是簡單的運行進程的命令。 最后,(Boss總是最后出場的). 我們來瞧瞧fork方法的使用.
fork其實也是用來執(zhí)行進程,比如,spawn("node",['app.js']),其實和fork('app.js') 是一樣的效果的。但是,fork厲害的地方在于他在開啟一個子進程時,同時建立了一個信息通道(雙工的哦). 倆個進程之間使用process.on("message",fn)和process.send(...)進行信息的交流.

child_process.fork(order) //創(chuàng)建子進程

worker.on('message',cb) //監(jiān)聽message事件

worker.send(mes) //發(fā)送信息

他和spawn類似都是通過返回的通道進行通信。舉一個demo, 兩個文件master.js和worker.js 來看一下.

//master.js
const childProcess = require('child_process');
const worker = childProcess.fork('worker.js');

worker.on('message',function(mes){
  console.log(`from worder, message: ${mes}`);
});
worker.send("this is master");

//worker.js
process.on('message',function(mes){
  console.log(`from master, message: ${mes}`);
});
process.send("this is worker");

運行,node app.js, 會輸出一下結果:

from master, message: this is master
from worker, message: this is worker

現(xiàn)在我們已經(jīng)學會了,如何使用child_process來創(chuàng)建一個基本的進程了。
關于net 這一模塊,大家可以參考一下net模塊.

ok . 現(xiàn)在我們正式進入,模擬nodeJS cluster模塊通信的procedure了。

out of date 的cluster

這里先介紹一下,曾經(jīng)的cluster實現(xiàn)的一套機理。同樣,再放一次圖

我們使用net和child_process來模仿一下。

//master.js
const net = require('net');
const fork = require('child_process').fork;

var handle = net._createServerHandle('0.0.0.0', 3000);

for(var i=0;i<4;i++) {
  fork('./worker').send({}, handle);
}
//worker.js
const net = require('net');
//監(jiān)聽master發(fā)送過來的信息
process.on('message', function(m, handle) {
 start(handle);
});

var buf = 'hello nodejs'; ///返回信息
var res = ['HTTP/1.1 200 OK','content-length:'+buf.length].join('\r\n')+'\r\n\r\n'+buf; //嵌套字

function start(server) {
  server.listen();
  var num=0;
  //監(jiān)聽connection函數(shù)
  server.onconnection = function(err,handle) {
    num++;
    console.log(`worker[${process.pid}]:${num}`);
    var socket = new net.Socket({
      handle: handle
    });
    socket.readable = socket.writable = true;
    socket.end(res);
  }
}

ok~ 我們運行一下程序, 首先運行node master.js.
然后使用測試工具,siege.
siege -c 100 -r 2 http://localhost:3000
OK,我們看一下,到底此時的負載是否均衡。

worker[1182]:52
worker[1183]:42
worker[1184]:90
worker[1181]:16

發(fā)現(xiàn),這樣任由worker去爭奪請求,效率真的很低呀。每一次,觸發(fā)請求,都有可能導致驚群事件的發(fā)生啊喂。所以,后來cluster改變了一種模式,使用master來控制請求的分配,官方給出的算法其實就是round-robin 輪轉(zhuǎn)方法。

高富帥版cluster

現(xiàn)在具體的實現(xiàn)模型就變成這個.

由master來控制請求的給予。通過監(jiān)聽端口,創(chuàng)建一個socket,將獲得的請求傳遞給子進程。

從tj大神那里借鑒的代碼demo:

//master
const net = require('net');
const fork = require('child_process').fork;

var workers = [];
for (var i = 0; i < 4; i++) {
  workers.push(fork('./worker'));
}

var handle = net._createServerHandle('0.0.0.0', 3000);
handle.listen();
//將監(jiān)聽事件移到master中
handle.onconnection = function (err,handle) {
  var worker = workers.pop(); //取出一個pop
  worker.send({},handle);
  workers.unshift(worker); //再放回取出的pop
}


//worker.js
const net = require('net');
process.on('message', function (m, handle) {
 start(handle);
});

var buf = 'hello Node.js';
var res = ['HTTP/1.1 200 OK','content-length:'+buf.length].join('\r\n')+'\r\n\r\n'+buf;

function start(handle) {
  console.log('got a connection on worker, pid = %d', process.pid);
  var socket = new net.Socket({
    handle: handle
  });
  socket.readable = socket.writable = true;
  socket.end(res);
}

這里就經(jīng)由master來掌控全局了. 當一個皇帝(worker)正在寵幸妃子的時候,master就會安排剩下的幾個皇帝排隊一個幾個的來。 其實中間的handle就會我們具體的業(yè)務邏輯. 如同:app.js.
ok~ 我們再來看一下cluster模塊實現(xiàn)多進程的具體寫法.

cluster模塊實現(xiàn)多進程

現(xiàn)在的cluster已經(jīng)可以說完全做到的負載均衡。在cluster說明我已經(jīng)做了闡述了。我們來看一下具體的實現(xiàn)吧

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

if (cluster.isMaster) {
  console.log('[master] ' + "start master...");

  for (var i = 0; i < numCPUs; i++) {
     cluster.fork();
  }

  cluster.on('listening', function (worker, address) {
    console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port);
  });

} else if (cluster.isWorker) {
   console.log('[worker] ' + "start worker ..." + cluster.worker.id);
  var num = 0;
  http.createServer(function (req, res) {
    num++;
    console.log('worker'+cluster.worker.id+":"+num);
    res.end('worker'+cluster.worker.id+',PID:'+process.pid);
  }).listen(3000);
}

這里使用的是HTTP模塊,當然,完全也可以替換為socket模塊. 不過由于這樣書寫,將集群和單邊給混淆了。 所以,推薦寫法是將具體業(yè)務邏輯獨立出來.

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

if (cluster.isMaster) {
  console.log('[master] ' + "start master...");

  for (var i = 0; i < numCPUs; i++) {
     cluster.fork();
  }

  cluster.on('listening', function (worker, address) {
    console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port);
  });

} else if (cluster.isWorker) {
  require('app.js');
}
//app.js就是開啟具體的業(yè)務邏輯了

//app.js具體內(nèi)容
const net = require('net');
//自動創(chuàng)建socket
const server = net.createServer(function(socket) { //'connection' listener
  socket.on('end', function() {
    console.log('server disconnected');
  });
  socket.on('data', function() {
    socket.end('hello\r\n');
  });
});
//開啟端口的監(jiān)聽
server.listen(8124, function() { //'listening' listener
  console.log('working')
});

接著我們開啟服務,node master.js
然后進行測試

siege -c 100 -r 2 http://localhost:8124

我這里開啟的是長連接. 每個worker處理的長連接數(shù)是有限的。所以,當有額外的連接到來時,worker會斷開當前沒有響應的連接,去處理新的連接。
不過,平常我們都是使用HTTP開啟 短連接,快速處理大并發(fā)的請求。
這是我改成HTTP短連接之后的結果

Transactions:         200 hits
Availability:       100.00 %
Elapsed time:        2.09 secs
Data transferred:      0.00 MB
Response time:        0.02 secs
Transaction rate:      95.69 trans/sec
Throughput:        0.00 MB/sec
Concurrency:        1.74
Successful transactions:     200
Failed transactions:        0
Longest transaction:      0.05
Shortest transaction:      0.02

那,怎么模擬大并發(fā)嘞?
e e e e e e e e e ...
自己解決啊~

開玩笑的啦~ 不然我寫blog是為了什么呢? 就是為了傳播知識.
在介紹工具之前,我想先說幾個關于性能的基本概念
QPS(TPS),并發(fā)數(shù),響應時間,吞吐量,吞吐率

你母雞的性能測試theories

自從我們和服務器扯上關系后,我們前端的性能測試真的很多。但這也是我們必須掌握的tip. 本來前端寶寶只需要看看控制臺,了解一下網(wǎng)頁運行是否運行順暢, 看看TimeLine,Profile 就可以了。 不過,作為一名有追求,有志于改變世界的童鞋來說。。。
md~ 又要學了...

ok~ 好了,在進入正題之前,我再放一次 線上的測試結果.

Transactions:         200 hits
Availability:       100.00 %
Elapsed time:        13.46 secs
Data transferred:      0.15 MB
Response time:        3.64 secs
Transaction rate:      14.86 trans/sec
Throughput:        0.01 MB/sec
Concurrency:        54.15
Successful transactions:     200
Failed transactions:        0
Longest transaction:      11.27
Shortest transaction:      0.01

根據(jù)上面的數(shù)據(jù),就可以得出,你網(wǎng)頁的大致性能了。
恩~ let's begin

吞吐率

關于吞吐率有多種解讀,一種是:描繪web服務器單位時間處理請求的能力。根據(jù)這個描述,其單位就為: req/sec. 另一種是: 單位時間內(nèi)網(wǎng)絡上傳輸?shù)臄?shù)據(jù)量。 而根據(jù)這個描述的話,他的單位就為: MB/sec.
而這個指標就是上面數(shù)據(jù)中的Throughput. 當然,肯定是越大越好了

吞吐量

這個和上面的吞吐率很有點關系的。 吞吐量是在沒有時間的限制下,你一次測試的傳輸數(shù)據(jù)總和。 所以,沒有時間條件的測試,都是耍流氓。
這個對應于上面數(shù)據(jù)中的Data transferred.

事務 && TPS

熟悉數(shù)據(jù)庫操作的童鞋,應該知道,在數(shù)據(jù)庫中常常會提到一個叫做事務的概念。 在數(shù)據(jù)庫中,一個事務,常常代表著一個具體的處理流程和結果. 比如,我現(xiàn)在想要的數(shù)據(jù)是 2013-2015年,數(shù)學期末考試成績排名. 這個就是一個具體的事務,那么我們映射到數(shù)據(jù)庫中就是,取出2013-2015年的排名,然后取平均值,返回最后的排序結果。 可以看出,事務并不單單指單一的操作,他是由一個或一個以上 操作組合而成具有 實際意義的。 那,反映到前端測試,我們應該怎樣去定義呢? 首先,我們需要了解,前端的網(wǎng)絡交流其實就是 請求-響應模式. 也就是說,每一次請求,我們都可以理解為一次事務(trans).
所以,TPS(transaction per second)就可以理解為1sec內(nèi),系統(tǒng)能夠處理的請求數(shù)目.他的單位也就是: trans/sec . 你當然也可以理解為seq/sec.
所以說,TPS 應該是衡量一個系統(tǒng)承載力最優(yōu)的一個標識.
TPS的計算公式很容易的出來就是: Transactions / Elapsed time.
不過, 凡事無絕對。 大家以后遇到測試的時候,應該就會知道的.

并發(fā)數(shù)

就是服務器能夠并發(fā)處理的連接數(shù),具體我也母雞他的單位是什么。 官方給出的解釋是:

Concurrency is average number of simultaneous connections, a number which rises as server performance decreases.

這里我們就理解為,這就是一個衡量系統(tǒng)的承載力的一個標準吧。 當Concurrency 越高,表示 系統(tǒng)承載的越多,但性能也越低。

ok~ 但是我們?nèi)绾卫眠@些數(shù)據(jù),來確定我們的并發(fā)策略呢? e e e e e e e ...
當然, 一兩次測試的結果真的沒有什么卵用. 所以實際上,我們需要進行多次測試,然后畫圖才行。 當然,一些大公司,早就有一套完整的系統(tǒng)來計算你web服務器的瓶頸,以及 給出 最優(yōu)的并發(fā)策略.
廢話不多說,我們來看看,如何分析,才能得出 比較好的 并發(fā)策略。

探究并發(fā)策略

首先,我們這里的并發(fā)需要進行區(qū)分. 一個是并發(fā)的請求數(shù),一個是并發(fā)的用戶數(shù). 這兩個對于服務器是完全不同的需求。
假如100個用戶同時向服務器分別進行10次請求,與1個用戶向服務器連續(xù)進行1000次請求。兩個的效果一樣么?

一個用戶向服務器連續(xù)進行1000次請求的過程中,任何時刻服務器的網(wǎng)卡接受緩存區(qū)中只有來自該用戶的1個請求,而100個用戶同時向服務器分別進行10次請求的過程中,服務器網(wǎng)卡接收緩沖區(qū)中最多有100個等待處理的請求,顯然這時候服務器的壓力更大。

所以上面所說的 并發(fā)用戶數(shù)和吞吐率 是完全不一樣的.
不過通常來說,我們更看重的是Concurrency(并發(fā)用戶數(shù)). 因為這樣更能反映出系統(tǒng)的 能力。 一般,我們都會對并發(fā)用戶數(shù)進行一些限制,比如apache的maxClients參數(shù).
ok~ 我們來實例分析一下吧.

首先,我們拿到一份測試數(shù)據(jù).

接著,我們進行數(shù)據(jù)分析.

根據(jù)并發(fā)數(shù)和吞吐率的關系得出下列的圖.

OK~ 我們會發(fā)現(xiàn)從大約130并發(fā)數(shù)的地方開始,吞吐率開始下降,而且越多下降的越厲害。 主要是因為,在前面部分隨著用戶數(shù)的上升,空閑的系統(tǒng)資源得到充分的利用,當然就和正太曲線一樣,總會有個頂點。 當?shù)竭_一定值后,頂點就會出現(xiàn)了. 這就我們的系統(tǒng)的一個瓶頸.

接著,我們細化分析,響應時間和并發(fā)用戶數(shù)的相關性

同樣額道理,當并發(fā)數(shù)到達130左右,正對每個req的響應時間開始增加,越大越抖,這適合吞吐率是相關的。 所以,我們可以得出一個結論,該次連接 并發(fā)數(shù) 最好設置為100~150之間。 當然,這樣的分析很膚淺,不過,對于我們這些前端寶寶來說了解一下就足夠了。

接下來,我們使用工具來武裝自己的頭腦.
這里主要介紹一個測試工具,siege.

并發(fā)測試工具

事實上并發(fā)測試工具主要有3個siege,ab,還有webbench. 我這里之所以沒介紹webbench的原因,因為,我在嘗試安裝他時,老子,電腦差點就掛了(我的MAC pro)... 不過后面,被聰明的我 巧妙的挽回~ 所以,如果有其他大神在MAC x11 上成功安裝,可以私信小弟。讓我學習學習。
ok~ 吐槽完了。我們正式說一下siege吧

siege

安裝siege利用MAC神器 homebrew, 就是就和js前端世界的npm一樣.
安裝ing:

brew install siege

安裝成功--bingo
接著,我們來看一下語法吧.

-c NUM 設置并發(fā)的用戶數(shù)量.eg: -c 100;

-r NUM 設置發(fā)送幾輪的請求,即,總的請求數(shù)為: -cNum*-rNum但是, -r不能和-t一起使用(為什么呢?你猜).eg: -r 20

-t NUM 測試持續(xù)時間,指你運行一次測試需要的時間,在timeout后,結束測試.

-f file. 用來測試file里面的url路徑 eg: -f girls.txt.

-b . 就是詢問開不開啟基準測試(benchmark)。 這個參數(shù)不太重要,有興趣的同學,可以下去學習一下。

關于-c -r我就不介紹了。 大家有興趣,可以參考一下,我前一篇文章讓你升級的網(wǎng)絡知識. 這里主要介紹一下 -f 參數(shù).
通常,如果我們想要測試多個頁面的話,可以新建一個文件,在文件中創(chuàng)建 你想測試的所有網(wǎng)頁地址.
比如:
//文件名為 urls.txt

www.example.com
www.example.org
123.45.67.89

然后運行測試

siege -f your/file/path.txt -c 100 -t 10s

OK~ 關于進程和測試的內(nèi)容就介紹到這了。

相關文章

  • npm install安裝離線包的實現(xiàn)過程

    npm install安裝離線包的實現(xiàn)過程

    這篇文章主要介紹了npm install安裝離線包的實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-10-10
  • Node.js實現(xiàn)爬取網(wǎng)站圖片的示例代碼

    Node.js實現(xiàn)爬取網(wǎng)站圖片的示例代碼

    本文將利用Node.js開發(fā)一個小示例—爬取某圖片網(wǎng)站的圖片,文中涉及的知識點有https模塊、cheerio模塊、fs模塊和閉包,感興趣的可以了解一下
    2022-04-04
  • 淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟)

    淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟)

    這篇文章主要介紹了淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • node.js+Ajax實現(xiàn)獲取HTTP服務器返回數(shù)據(jù)

    node.js+Ajax實現(xiàn)獲取HTTP服務器返回數(shù)據(jù)

    這篇文章主要介紹了node.js+Ajax實現(xiàn)獲取HTTP服務器返回數(shù)據(jù),講解的十分詳細,也給出了很多的實例,是篇非常不錯的文章,這里推薦給大家。
    2014-11-11
  • node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法

    node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法

    Redis數(shù)據(jù)庫采用極簡的設計思想,最新版的源碼包還不到2Mb。其在使用上也有別于一般的數(shù)據(jù)庫。下面這篇文章就來給大家介紹了node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Node.js中sequelize時區(qū)的配置方法

    Node.js中sequelize時區(qū)的配置方法

    這篇文章主要給大家介紹了關于Node.js中sequelize時區(qū)的配置方法,文中先對時區(qū)的基礎概念進行了簡單介紹,然后通過示例代碼詳細介紹了sequelize時區(qū)的配置方法,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-12-12
  • 可能是全網(wǎng)最詳細的nodejs卸載和安裝教程

    可能是全網(wǎng)最詳細的nodejs卸載和安裝教程

    npm的中文意思為"node包管理器",是Node.js平臺的默認包管理工具,會隨著Nodejs一起安裝,npm管理對應node.js的第三方插件,下面這篇文章主要給大家介紹了關于nodejs卸載和安裝教程的相關資料,這可能全網(wǎng)最詳細的教程了,需要的朋友可以參考下
    2023-05-05
  • 利用Node.js了解與測量HTTP所花費的時間詳解

    利用Node.js了解與測量HTTP所花費的時間詳解

    這篇文章主要給大家介紹了關于利用Node.js了解與測量HTTP所花費的時間的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • Node.js中的http請求客戶端示例(request client)

    Node.js中的http請求客戶端示例(request client)

    本篇文章主要介紹了Node.js中的http請求客戶端示例(request client),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 一文帶你了解Node.js有哪些架構模式

    一文帶你了解Node.js有哪些架構模式

    Node.js 憑借其非阻塞、事件驅(qū)動的架構,已成為構建各種應用程序的流行選擇,使用 Node.js 進行開發(fā)時,選擇正確的架構模式來滿足項目需求至關重要,在本文中,我們將探討幾種 Node.js 架構模式并提供示例來說明它們的用法,需要的朋友可以參考下
    2023-09-09

最新評論

吴江市| 含山县| 隆子县| 绿春县| 仪陇县| 万盛区| 邓州市| 互助| 昭觉县| 涿鹿县| 遂平县| 叶城县| 兴隆县| 南丹县| 哈尔滨市| 通河县| 宝丰县| 临湘市| 富平县| 松江区| 鹿泉市| 和静县| 龙川县| 仙桃市| 凤城市| 宣化县| 凯里市| 廉江市| 秦皇岛市| 崇州市| 稻城县| 通许县| 文水县| 泾川县| 绥芬河市| 香河县| 阜城县| 景洪市| 舒兰市| 赞皇县| 天柱县|