您好,登錄后才能下訂單哦!
我們在電腦中會運(yùn)行多個(gè)程序,每一個(gè)程序中都會有多個(gè)線程。
例如我們運(yùn)行比特幣客戶端的時(shí)候,我們某一個(gè)線程要處理網(wǎng)絡(luò)、某一個(gè)線程要處理挖礦、某一個(gè)線程要處理用戶輸入…
線程的調(diào)度使用了操作系統(tǒng)級別的調(diào)度器來明確了哪一個(gè)線程應(yīng)該被執(zhí)行。線程也有優(yōu)先級之分,例如監(jiān)聽鼠標(biāo)滑動的優(yōu)先級就會很高,因?yàn)槠洳荒艿却L的時(shí)間。
為了在給定的時(shí)間內(nèi)更快更多的處理線程:
1、我們可以通過增加CPU的核心數(shù)量或者是
2、調(diào)度器當(dāng)監(jiān)測到線程中運(yùn)行中斷,如讀取文件網(wǎng)絡(luò)時(shí),及時(shí)切換到其他的線程中執(zhí)行。
nodejs是單線程的事件循環(huán)機(jī)制
偽代碼演示事件循環(huán):
1 | const peningTimers =[]; |
nodejs的單線程,是對于其處理事件循環(huán)來講的,有了事件觸發(fā),就會執(zhí)行相應(yīng)函數(shù)。沒有事件觸發(fā),就會等待。從這個(gè)意義上來說,nodejs是單線程的。
但是在處理具體的任務(wù),函數(shù)的時(shí)候。nodejs確是多線程的。
1 | const crypto = require('crypto'); |
測試pbkdf2速度:1: 868
1 | const crypto = require('crypto'); |
測試pbkdf2速度:
1 | 1: 891 |
說明了pbkdf2函數(shù)是多線程來執(zhí)行的。libuv中默認(rèn)有4個(gè)線程,pbkdf2函數(shù)正是借助libuv實(shí)現(xiàn)了多線程。
1 | const crypto = require('crypto'); |
1 | 4: 919 |
注意,明顯第5個(gè)線程時(shí)間增加了一倍,因?yàn)槟J(rèn)libuv中默認(rèn)有4個(gè)線程,第5個(gè)線程陷入了等待。
1 | process.env.UV_THREADPOOL_SIZE = 5; |
測試速度:
1 | 1: 956 |
1 | const https = require('https'); |
測試速度:
1 | 48 |
https網(wǎng)絡(luò)訪問,調(diào)用了操作系統(tǒng)資源,libuv只是起到了代理的作用,所以不收到libuv默認(rèn)4個(gè)線程的限制。
本文鏈接: https://dreamerjonson.com/2018/11/09/深度理解nodejs-2/
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY 4.0 CN協(xié)議 許可協(xié)議。轉(zhuǎn)載請注明出處!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。