天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

一個(gè)前端工程師眼里的NodeJS

  JavaScript單線程的誤解

  在我接觸JavaScript(無論瀏覽器還是NodeJS)的時(shí)間里,總是遇到有朋友有多線程的需求。而在NodeJS方面,有朋友甚至直接說到,NodeJS是單線程的,無法很好的利用多核CPU。

  誠然,在前端的瀏覽器中,由于前端的JavaScript與UI占據(jù)同一線程,執(zhí)行JavaScript確實(shí)為UI響應(yīng)造成了一定程度上的麻煩。但是,除非用到超大的循環(huán)語句執(zhí)行JavaScript,或是用阻塞式的Ajax,或是太過頻繁的定時(shí)器執(zhí)行外,JavaScript并沒有給前端應(yīng)用帶來明顯的問題,所以也很少有朋友抱怨JavaScript是單線程而不能很好利用多核CPU的問題,因?yàn)闆]有因此出現(xiàn)性能瓶頸。

  但是,我們可以用Ajax和Web Worker回應(yīng)這個(gè)誤解。當(dāng)Ajax請求發(fā)送之后,除非是同步請求,否則其余的JavaScript代碼會很快被執(zhí)行到。在Ajax發(fā)送完成,直到接收到響應(yīng)的這段時(shí)間里,這個(gè)網(wǎng)絡(luò)請求并不會阻塞JavaScript的執(zhí)行,而網(wǎng)絡(luò)請求已經(jīng)發(fā)生,這是必然的事。那么,答案就很明顯了,JavaScript確實(shí)是執(zhí)行在單線程上的,但是,整個(gè)Web應(yīng)用執(zhí)行的宿主(瀏覽器)并非以單線程的方式在執(zhí)行。而Web Worker的誕生,就是直接為了解決JavaScript與UI占用同一線程造成的UI響應(yīng)問題的,它能新開一條線程去執(zhí)行JavaScript。

  同理,NodeJS中的JavaScript也確實(shí)是在單線程上執(zhí)行,但是作為宿主的NodeJS,它本身并非是單線程的,NodeJS在I/O方面又動用到一小部分額外的線程協(xié)助實(shí)現(xiàn)異步。程序員沒有機(jī)會直接創(chuàng)建線程,這也是有的同學(xué)想當(dāng)然的認(rèn)為NodeJS的單線程無法很好的利用多核CPU的原因,他們甚至?xí)f,難以想象由多人一起協(xié)作開發(fā)一個(gè)單線程的程序。

  NodeJS封裝了內(nèi)部的異步實(shí)現(xiàn)后,導(dǎo)致程序員無法直接操作線程,也就造成所有的業(yè)務(wù)邏輯運(yùn)算都會丟到JavaScript的執(zhí)行線程上,這也就意味著,在高并發(fā)請求的時(shí)候,I/O的問題是很好的解決了,但是所有的業(yè)務(wù)邏輯運(yùn)算積少成多地都運(yùn)行在JavaScript線程上,形成了一條擁擠的JavaScript運(yùn)算線程。NodeJS的弱點(diǎn)在這個(gè)時(shí)候會暴露出來,單線程執(zhí)行運(yùn)算形成的瓶頸,拖慢了I/O的效率。這大概可以算得上是密集運(yùn)算情況下無法很好利用多核CPU的缺點(diǎn)。這條擁擠的JavaScript線程,給I/O形成了性能上限。

  但是,事情又并非絕對的?;氐角岸藶g覽器中,為了解決線程擁擠的情況,Web Worker應(yīng)運(yùn)而生。而同樣,Node也提供了child_process.fork來創(chuàng)建Node的子進(jìn)程。在一個(gè)Node進(jìn)程就能很好的解決密集I/O的情況下,fork出來的其余Node子進(jìn)程可以當(dāng)作常駐服務(wù)來解決運(yùn)算阻塞的問題(將運(yùn)算分發(fā)到多個(gè)Node子進(jìn)程中上去,與Apache創(chuàng)建多個(gè)子進(jìn)程類似)。當(dāng)然child_process/Web Worker的機(jī)制永遠(yuǎn)只能解決單臺機(jī)器的問題,大的Web應(yīng)用是不可能一臺服務(wù)器就能完成所有的請求服務(wù)的。拜NodeJS在I/O上的優(yōu)勢,跨OS的多Node之間通信的是不算什么問題的。解決NodeJS的運(yùn)算密集問題的答案其實(shí)也是非常簡單的,就是將運(yùn)算分發(fā)到多個(gè)CPU上。請參考文章后的multi-node的性能測試,可以看到在多Node進(jìn)程的情景下,響應(yīng)請求的速度被大幅度提高。

  在文章的寫作中,Node最新發(fā)布的0.5.10版本新增了cluster啟動參數(shù)。參數(shù)的使用方式如下:

node cluster server.js

it知識庫一個(gè)前端工程師眼里的NodeJS,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久香蕉国产线看观看精品 | 情浓野战台湾三级 | 久久se精品一区二区国产 | 空姐厕所啪啪啪 | 国产永不无码精品AV永久 | 99视频在线精品免费观看18 | 绿巨人www在线观看 绿巨人www | 超碰久久国产vs | 蜜桃精品成人影片 | 免费国产综合视频在线看 | 99久久精品一区二区三区 | 国产精品一国产AV麻豆 | 欧美男同gay粗大又长 | 调教椅上的调教SM总裁被调教 | 欧美一区二区高清 | 久久vs国产综合色 | 脱女学小内内摸出水网站免费 | BLACKED太粗太长| 国产午夜不卡在线观看视频666 | 把手戳进美女尿口里动态图 | 97人妻久久久精品系列A片 | 色AV色婷婷66人妻久久久 | 最近日本MV字幕免费观看视频 | 3D内射动漫同人资源在线观看 | 午夜国产精品视频在线 | 97久久精品人人槡人妻人 | 波多野结衣的AV一区二区三区 | 99国产精品成人免费视频 | 一二三四在线视频社区 | 高清国产一区 | 俄罗斯破处 | 免费国产成人高清在线看软件 | 青草精品国产福利在线视频 | 欧美阿v在线天堂 | 无码爽死成人777在线观看网站 | 久久综合狠狠综合久久综合88 | 国产一区二区精品视频 | 亚洲AV一宅男色影视 | 99久久国产综合精品国 | 国产成人欧美日韩在线电影 | 99久久久无码国产精品免费人妻 |