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

溫馨提示×

溫馨提示×

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

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

深度理解nodejs[2]-事件循環

發布時間:2020-07-14 19:54:26 來源:網絡 閱讀:171 作者:jonson_jackson 欄目:開發技術

進程與線程

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

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

事件循環

nodejs是單線程的事件循環機制
偽代碼演示事件循環:

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(){ //是否繼續
 1、檢查setTimeOut、setInterval、setImmediate
 2、檢查是否有監聽端口等操作系統級別的任務
 3、檢查是否有文件、網絡等長期的操作
return peningTimers.length || pendingOSTasks.length || pendingOperations.length;
}

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

3、退出

nodejs的單線程與多線程

nodejs的單線程,是對于其處理事件循環來講的,有了事件觸發,就會執行相應函數。沒有事件觸發,就會等待。從這個意義上來說,nodejs是單線程的。
但是在處理具體的任務,函數的時候。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函數是多線程來執行的。libuv中默認有4個線程,pbkdf2函數正是借助libuv實現了多線程。

測試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網絡訪問,調用了操作系統資源,libuv只是起到了代理的作用,所以不收到libuv默認4個線程的限制。

總結

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

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

深度理解nodejs[2]-事件循環

向AI問一下細節

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

AI

武城县| 宁德市| 新巴尔虎右旗| 红河县| 科技| 昆山市| 辽宁省| 交口县| 孟村| 临高县| 丁青县| 晋江市| 海淀区| 资阳市| 宝山区| 江永县| 游戏| 缙云县| 临颍县| 青川县| 磐石市| 广州市| 迁西县| 吉林省| 来安县| 龙南县| 青州市| 盐亭县| 万山特区| 绿春县| 沙洋县| 沂源县| 衡阳市| 梁山县| 东山县| 彩票| 石门县| 神池县| 富平县| 石狮市| 阆中市|