gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

如何理解 Node.js 不是完全的單線程的程序(淺析)

為什么說 Node.js 不是完全的單線程?如何理解?下面本篇文章就來帶大家探討一下,希望對大家有所幫助!

如何理解 Node.js 不是完全的單線程的程序(淺析)

相信大家都知道 node 是一個單線程程序,使用了 Event Loop 可以做到多并發(fā)。可惜這是不完全正確的。

那么為什么說 Node.js 不是完全的單線程的程序呢?

Node.js 是單線程的程序*

所有我們自己寫的 Javsacript,V8, event loop都跑在同一個線程里面,也就是 main thrad。

哎嗨,這不正說明 node 是單線程的嗎?

但是也許你不知道 node 有很多模塊背后都是 C++ code。

雖然 node 沒有給使用者暴露控制 thread 的權(quán)限,但是 C++ 是可以使用多線程的。

那么什么時候 node 會使用多線程呢?

  • 如果一個 node 方法,背后調(diào)用C++的同步方法,那么都是跑在 main thread 里面的。

  • 如果一個 node 方法,背后調(diào)用C++的異步方法,有時候不是跑在 main thread 里面的。

Talk is cheap, show me the code.

同步方法,跑在 main thread 里面

這里 crypto 相關(guān)模塊,很多是 C++ 寫的。下面一段程序是計算hash的函數(shù),一般用來存儲密碼。

import { pbkdf2Sync } from "crypto"; const startTime = Date.now(); let index = 0; for (index = 0; index < 3; index++) {     pbkdf2Sync("secret", "salt", 100000, 64, "sha512");     const endTime = Date.now();     console.log(`${index} time, ${endTime - startTime}`); } const endTime = Date.now(); console.log(`in the end`);

輸出的時間,

0 time, 44  1 time, 90 2 time, 134 in the end

可以看到每次大概都是花費~45ms,代碼 main thread 上順序執(zhí)行。

注意最后的輸出是誰? 注意這里一次 hash 在我的 cpu 需要~45ms。

異步 pbkdf2 方法,不跑在 main thread 里面

import { cpus } from "os"; import { pbkdf2 } from "crypto"; console.log(cpus().length); let startTime = console.time("time-main-end"); for (let index = 0; index < 4; index++) {     startTime = console.time(`time-${index}`);     pbkdf2("secret", `salt${index}`, 100000, 64, "sha512", (err, derivedKey) => {         if (err) throw err;         console.timeEnd(`time-${index}`);     }); } console.timeEnd("time-main-end");

輸出的時間,

time-main-end: 0.31ms time-2: 45.646ms time-0: 46.055ms time-3: 46.846ms time-1: 47.159ms

這里看到,main thread 早早結(jié)束,然而每次計算的時間都是45ms,要知道一個 cpu 計算 hash 的時間是45ms,這里 node 絕對使用了多個線程進(jìn)行hash計算。

如果我這里把調(diào)用次數(shù)改成10次,那么時間如下,可以看到隨著CPU核數(shù)的用完,時間也在增加。再一次證明node 絕對使用了多個線程進(jìn)行hash計算。

time-main-end: 0.451ms time-1: 44.977ms time-2: 46.069ms time-3: 50.033ms time-0: 51.381ms time-5: 96.429ms // 注意這里,從第五次時間開始增加了 time-7: 101.61ms time-4: 113.535ms time-6: 121.429ms time-9: 151.035ms time-8: 152.585ms

雖然這里證明了,node絕對啟用了多線程。但是有一點點小小的問題?我的電腦的CPU是AMD R5-5600U,有6個核心12線程啊。但是為什么時間是從第五次開始增加的呢,node沒有完全利用我的CPU啊?

原因是什么呢?

Node 使用了預(yù)定義的線程池,這個線程池的大小默認(rèn)是4.

export UV_THREADPOOL_SIZE=6

讓我們在看一個例子,

HTTP request

import { request } from "https"; const options = {   hostname: "www.baidu.com",   port: 443,   path: "/img/PC_7ac6a6d319ba4ae29b38e5e4280e9122.png",   method: "GET", };  let startTime = console.time(`main`);  for (let index = 0; index < 15; index++) {   startTime = console.time(`time-${index}`);   const req = request(options, (res) => {     console.log(`statusCode: ${res.statusCode}`);     console.timeEnd(`time-${index}`);     res.on("data", (d) => {       // process.stdout.write(d);     });   });    req.on("error", (error) => {     console.error(error);   });    req.end(); }  console.timeEnd("main");
main: 13.927ms time-2: 83.247ms time-4: 89.641ms time-3: 91.497ms time-12: 91.661ms time-5: 94.677ms ..... time-8: 134.026ms time-1: 143.906ms time-13: 140.914ms time-10: 144.088ms

這里主程序也早早結(jié)束了,這里我啟動 http request 去下載15次圖片,他們花費的時間并沒有成倍增加,似乎不受限于線程池/cpu的影響。

為什么?。浚縉ode 到底有沒有在使用線程池啊?

如果 Node 背后的 C++ 的異步方法,首先會嘗試是否有內(nèi)核異步支持,比如這里網(wǎng)絡(luò)請是使用 epoll (Linux),如果內(nèi)核沒有提供異步方式,Node才會使用自己的線程池。。

所以 http 請求雖然是異步,不過是由內(nèi)核實現(xiàn)的,等到內(nèi)核完成后,會通知C++, C++會通知給 main thread 處理callback。

那么 Node 哪些異步方法會使用線程池呢?哪些不會呢?

  • 原生 Kernal Async

    • TCP/UDP server client
    • Unix Domain Sockets (IPC)
    • pipes
    • dns.resolveXXX
    • tty input(stdin etc)
    • Unix signals
    • Child process
  • Thread pool

    • fs.*
    • dns.lookup
    • pipe (edge case)

這也是大部分 Node 優(yōu)化的切入點。

但是這些怎么和最重要的 Event Loop 結(jié)合起來呢?

Event Loop

相信大家都對 Event loop 非常熟悉了。Event loop 好比一個分發(fā)員,

  • 如果是遇到普通 javascript 程序或者是 callback,交給 V8 處理。

  • 如果遇到同步方法后背是 C++ 寫的,交給C++,跑在 main thread。

  • 如果遇到異步方法后背是 C++ 寫的,如果有內(nèi)核異步支持,從main thread 交給內(nèi)核處理。

  • 如果是異步方法后背是 C++ 寫的,如果沒有內(nèi)核異步支持,從 main thread 交給 thread pool。

  • thread pool 和內(nèi)核有結(jié)果都會把結(jié)果返回 event loop,如果注冊的有 javascript callback,就交給V8進(jìn)行處理。

然后如此循環(huán),直到?jīng)]有東西可以處理。

所以 Node 不完全是單線程程序。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
青青草原播放器| 欧美a级黄色大片| 分分操这里只有精品| 特级毛片在线免费观看| 国产在线观看中文字幕| 在线免费av播放| 国产视频在线视频| 日韩一级片播放| av片中文字幕| 一区二区三区免费播放| 第四色婷婷基地| 亚洲欧美手机在线| 福利在线小视频| 男人添女人下面高潮视频| 久久精品免费一区二区| 99久久久无码国产精品6| 手机在线免费观看毛片| 一区二区三区四区毛片| 波多野结衣三级在线| 日本黄色片一级片| 黄色片视频在线播放| 欧美成人福利在线观看| 大地资源网在线观看免费官网| 久久久国内精品| 黄色av网址在线播放| 日本激情综合网| 三日本三级少妇三级99| 无码专区aaaaaa免费视频| 99久久国产宗和精品1上映| 色噜噜狠狠一区二区三区狼国成人| av不卡在线免费观看| 337p粉嫩大胆噜噜噜鲁| 国产精品jizz在线观看老狼| 精品人妻人人做人人爽| 波多野结衣xxxx| 男女激情无遮挡| 手机成人av在线| 在线观看国产中文字幕| 国产xxxx振车| 日本高清一区二区视频| 欧美丰满熟妇bbbbbb百度| 一本二本三本亚洲码 | 成人免费观看在线| 午夜dv内射一区二区| 欧美国产视频一区| 色婷婷.com| 国产97在线 | 亚洲| 久久综合亚洲精品| 在线一区二区不卡| 免费高清在线观看免费| 久久av综合网| 麻豆md0077饥渴少妇| 一级黄色特级片| 久久久久久久久久福利| 久久无码高潮喷水| 乱熟女高潮一区二区在线| 色撸撸在线观看| 国产精品自在自线| 午夜国产福利在线观看| 日本中文字幕观看| 日韩肉感妇bbwbbwbbw| 日本xxxxxxx免费视频| 国产日产欧美视频| 日日橹狠狠爱欧美超碰| 看av免费毛片手机播放 | 欧美亚洲日本在线观看| 欧美精品第三页| 99re在线视频免费观看| 天天影视综合色| mm1313亚洲国产精品无码试看| 国产二区视频在线播放| 女人喷潮完整视频| 国产成人久久婷婷精品流白浆| 成人在线看视频| 9l视频白拍9色9l视频| 中文字幕在线综合| 小说区视频区图片区| 国内精品国产三级国产aⅴ久| 夜夜爽久久精品91| 国产毛片久久久久久国产毛片| 在线观看污视频| 国产白丝袜美女久久久久| 欧美日韩激情视频在线观看| 午夜免费高清视频| 国产免费色视频| www精品久久| 最新中文字幕免费视频| 日本黄色播放器| 成人免费毛片在线观看| 一级在线免费视频| 好吊色这里只有精品| 欧美午夜小视频| the porn av| 成人一区二区av| 色综合天天色综合| 国产乱子伦精品视频| 人妻有码中文字幕| 黄色网址在线免费看| 凹凸国产熟女精品视频| 天天色天天干天天色| 精品无码国产一区二区三区av| 99蜜桃臀久久久欧美精品网站| 五月花丁香婷婷| 国产av天堂无码一区二区三区| 日韩亚洲在线视频| 欧日韩免费视频| 五月天国产视频| 中文字幕在线观看第三页| 亚洲色欲久久久综合网东京热| 少妇一级淫免费播放| 欧美视频在线免费播放| 少妇高潮大叫好爽喷水| 黄色小视频免费网站| 任你操这里只有精品| 999一区二区三区| 欧美性受黑人性爽| 亚洲免费黄色录像| 少妇一级淫免费播放| 中文字幕欧美人妻精品一区| 日本丰满少妇xxxx| 国产性生活免费视频| 国产91av视频在线观看| 五月激情五月婷婷| jizz18女人| 182午夜在线观看| 九色91popny| 青青草久久伊人| 国产精品区在线| 国产精品区在线| www.久久久久久久久久久| 午夜一区二区视频| 成人av毛片在线观看| 亚洲女人在线观看| 色姑娘综合天天| 伊人再见免费在线观看高清版| 国产免费一区二区三区四在线播放| 亚洲精品永久视频| 911福利视频| 超级碰在线观看| 欧美精品久久久久久久久久久| 国产片侵犯亲女视频播放| 国产黄色片免费在线观看| 欧美变态另类刺激| 日韩欧美在线播放视频| av网站在线不卡| 中文字幕第88页| 亚洲欧美一二三| 欧美不卡在线播放| 青青草av网站| 91视频福利网| 亚洲熟妇国产熟妇肥婆| 激情 小说 亚洲 图片: 伦| 欧美一级小视频| 六月婷婷激情综合| 男人舔女人下面高潮视频| 中日韩av在线播放| 欧美高清中文字幕| 免费在线观看毛片网站| 国产精品中文久久久久久| 精品国产一区三区| 九九九九九九九九| 欧美 日韩 激情| 欧美视频亚洲图片| 国产白丝袜美女久久久久| 亚洲一区二区偷拍| 日本精品一区二区三区四区| 亚洲这里只有精品| 青青青免费在线| www.黄色网址.com| 人人干人人视频| 国产在线xxxx| 亚洲第一天堂久久| 国产1区2区在线| 日韩精品综合在线| 亚洲精品乱码久久久久久动漫| 日韩精品视频一区二区在线观看| 国产欧美综合一区| 手机av在线免费| 成人羞羞国产免费网站| 丝袜人妻一区二区三区| 特级黄色录像片| 欧美日韩中文不卡| 丝袜制服一区二区三区| 97成人在线免费视频| 丁香六月激情网| 大陆极品少妇内射aaaaaa| 91免费网站视频| 一级黄色在线播放| 国产精品区在线| 久热精品在线播放| 亚洲污视频在线观看| 国产区二区三区| 色婷婷综合久久久久中文字幕| www.玖玖玖| 国产淫片av片久久久久久| 精品视频一区二区在线| 成人亚洲视频在线观看| 午夜免费精品视频| 青青草原国产在线视频| 五月花丁香婷婷|