日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深度理解nodejs[2]-事件循環(huán)-創(chuàng)新互聯(lián)

進程與線程

我們在電腦中會運行多個程序,每一個程序中都會有多個線程。
例如我們運行比特幣客戶端的時候,我們某一個線程要處理網(wǎng)絡、某一個線程要處理挖礦、某一個線程要處理用戶輸入…
線程的調度使用了操作系統(tǒng)級別的調度器來明確了哪一個線程應該被執(zhí)行。線程也有優(yōu)先級之分,例如監(jiān)聽鼠標滑動的優(yōu)先級就會很高,因為其不能等待太長的時間。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于做網(wǎng)站、網(wǎng)站制作、光明網(wǎng)絡推廣、小程序定制開發(fā)、光明網(wǎng)絡營銷、光明企業(yè)策劃、光明品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供光明建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

為了在給定的時間內更快更多的處理線程:
1、我們可以通過增加CPU的核心數(shù)量或者是
2、調度器當監(jiān)測到線程中運行中斷,如讀取文件網(wǎng)絡時,及時切換到其他的線程中執(zhí)行。

事件循環(huán)

nodejs是單線程的事件循環(huán)機制
偽代碼演示事件循環(huán):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const peningTimers =[];
const pendingOSTasks=[];
cosnt pendingOperations=[];

1、初始化
myfile.runContent()

function shouldContinue(){ //是否繼續(xù)
 1、檢查setTimeOut、setInterval、setImmediate
 2、檢查是否有監(jiān)聽端口等操作系統(tǒng)級別的任務
 3、檢查是否有文件、網(wǎng)絡等長期的操作
return peningTimers.length || pendingOSTasks.length || pendingOperations.length;
}

2、事件循環(huán)
while(shouldContinue()){
//1.觀察peningTimers.length,是否調查setTimeOut、setInterval等函數(shù)
//2、觀察pendingOSTasks.length  pendingOperations.length,并調用相關回調函數(shù)
//3.暫停、一直等到上面的某一個事件完成
//4、調用setImmediate等函數(shù)
//5、處理close事件
}

3、退出

nodejs的單線程與多線程

nodejs的單線程,是對于其處理事件循環(huán)來講的,有了事件觸發(fā),就會執(zhí)行相應函數(shù)。沒有事件觸發(fā),就會等待。從這個意義上來說,nodejs是單線程的。
但是在處理具體的任務,函數(shù)的時候。nodejs確是多線程的。

nodejs的單線程與多線程證明

1
2
3
4
5
6
7
const crypto = require('crypto');

const start = Date.now();

crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('1:',Date.now()-start);
});

測試pbkdf2速度:1: 868

1
2
3
4
5
6
7
8
9
10
11
const crypto = require('crypto');

const start = Date.now();

crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('1:',Date.now()-start);
});

crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('2:',Date.now()-start);
});

測試pbkdf2速度:

1
2
1: 891
2: 893

說明了pbkdf2函數(shù)是多線程來執(zhí)行的。libuv中默認有4個線程,pbkdf2函數(shù)正是借助libuv實現(xiàn)了多線程。

測試libuv中默認有4個線程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const crypto = require('crypto');

const start = Date.now();

crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('1:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('2:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('3:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('4:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('5:',Date.now()-start);
});
1
2
3
4
5
4: 919
1: 922
3: 936
2: 936
5: 1813

注意,明顯第5個線程時間增加了一倍,因為默認libuv中默認有4個線程,第5個線程陷入了等待。

修改libuv中默認默認線程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
process.env.UV_THREADPOOL_SIZE = 5;

const crypto = require('crypto');

const start = Date.now();

crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('1:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('2:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('3:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('4:',Date.now()-start);
});
crypto.pbkdf2('a','b',100000,512,'sha512',()=>{
 console.log('5:',Date.now()-start);
});

測試速度:

1
2
3
4
5
1: 956
5: 963
3: 970
2: 971
4: 974

http庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const https = require('https');
const start = Date.now();

function dorequest(){
 https.request('https://www.baidu.com',res=>{
  res.on('data',()=>{});
  res.on('end',()=>{
   console.log(Date.now()-start);
  });
 })
 .end();
}
dorequest();
dorequest();
dorequest();
dorequest();
dorequest();
dorequest();
dorequest();
dorequest();
dorequest();

測試速度:

1
2
3
4
5
6
7
8
9
48
50
52
53
54
55
57
58
62

https網(wǎng)絡訪問,調用了操作系統(tǒng)資源,libuv只是起到了代理的作用,所以不收到libuv默認4個線程的限制。

總結

pbkdf2等函數(shù)是借助libuv實現(xiàn)多線程的。但是當這些函數(shù)執(zhí)行完畢后,會觸發(fā)完成事件.nodejs主線程觸發(fā)事件的處理卻是單線程的。
  • 本文鏈接: https://dreamerjonson.com/2018/11/09/深度理解nodejs-2/

  • 版權聲明:本博客所有文章除特別聲明外,均采用 CC BY 4.0 CN協(xié)議 許可協(xié)議。轉載請注明出處!

深度理解nodejs[2]-事件循環(huán)

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


本文名稱:深度理解nodejs[2]-事件循環(huán)-創(chuàng)新互聯(lián)
分享地址:http://www.dlmjj.cn/article/deihie.html