Event Loop

Event Loop 是一個很重要的概念茸习,指的是計算機系統(tǒng)的一種運行機制柔逼。
JavaScript語言就采用這種機制,來解決單線程運行帶來的一些問題享钞。

Event Loop

本文參考C. Aaron Cois的《Understanding The Node.js Event Loop》揍诽,解釋什么是Event Loop,以及它與JavaScript語言的單線程模型有何關(guān)系嫩与。
想要理解Event Loop寝姿,就要從程序的運行模式講起。運行以后的程序叫做"進程"(process)划滋,一般情況下饵筑,一個進程一次只能執(zhí)行一個任務(wù)。
如果有很多任務(wù)需要執(zhí)行处坪,不外乎三種解決方法根资。
(1)排隊。因為一個進程一次只能執(zhí)行一個任務(wù)同窘,只好等前面的任務(wù)執(zhí)行完了玄帕,再執(zhí)行后面的任務(wù)。
(2)新建進程想邦。使用fork命令裤纹,為每個任務(wù)新建一個進程。
(3)新建線程丧没。因為進程太耗費資源鹰椒,所以如今的程序往往允許一個進程包含多個線程锡移,由線程去完成任務(wù)。(進程和線程的詳細解釋漆际,請看這里淆珊。)

以JavaScript語言為例,它是一種單線程語言奸汇,所有任務(wù)都在一個線程上完成施符,即采用上面的第一種方法。一旦遇到大量任務(wù)或者遇到一個耗時的任務(wù)擂找,網(wǎng)頁就會出現(xiàn)"假死"戳吝,因為JavaScript停不下來,也就無法響應(yīng)用戶的行為婴洼。
你也許會問骨坑,JavaScript為什么是單線程撼嗓,難道不能實現(xiàn)為多線程嗎?
這跟歷史有關(guān)系粉捻。JavaScript從誕生起就是單線程。原因大概是不想讓瀏覽器變得太復雜肩刃,因為多線程需要共享資源盈包、且有可能修改彼此的運行結(jié)果醇王,對于一種網(wǎng)頁腳本語言來說,這就太復雜了叛氨。后來就約定俗成棘伴,JavaScript為一種單線程語言。(Worker API可以實現(xiàn)多線程仁连,但是JavaScript本身始終是單線程的饭冬。)
如果某個任務(wù)很耗時,比如涉及很多I/O(輸入/輸出)操作伍伤,那么線程的運行大概是下面的樣子。

synchronous mode

上圖的綠色部分是程序的運行時間麦乞,紅色部分是等待時間姐直〗螅可以看到,由于I/O操作很慢插龄,所以這個線程的大部分運行時間都在空等I/O操作的返回結(jié)果均牢。這種運行方式稱為"同步模式"(synchronous I/O)或"堵塞模式"(blocking I/O)才睹。
如果采用多線程,同時運行多個任務(wù)垮庐,那很可能就是下面這樣坞琴。
synchronous mode

上圖表明置济,多線程不僅占用多倍的系統(tǒng)資源,也閑置多倍的資源护盈,這顯然不合理羞酗。
Event Loop就是為了解決這個問題而提出的。Wikipedia這樣定義:
"Event Loop是一個程序結(jié)構(gòu)欺嗤,用于等待和發(fā)送消息和事件卫枝。(a programming construct that waits for and dispatches events or messages in a program.)"

簡單說,就是在程序中設(shè)置兩個線程:一個負責程序本身的運行吆玖,稱為"主線程"马篮;另一個負責主線程與其他進程(主要是各種I/O操作)的通信浑测,被稱為"Event Loop線程"(可以譯為"消息線程")。

asynchronous mode

上圖主線程的綠色部分掷匠,還是表示運行時間槐雾,而橙色部分表示空閑時間幅狮。每當遇到I/O的時候崇摄,主線程就讓Event Loop線程去通知相應(yīng)的I/O程序慌烧,然后接著往后運行,所以不存在紅色的等待時間厕氨。等到I/O程序完成操作汹粤,Event Loop線程再把結(jié)果返回主線程。主線程就調(diào)用事先設(shè)定的回調(diào)函數(shù)国葬,完成整個任務(wù)。
可以看到接奈,由于多出了橙色的空閑時間序宦,所以主線程得以運行更多的任務(wù)背苦,這就提高了效率。這種運行方式稱為"異步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)疫剃。
這正是JavaScript語言的運行方式硼讽。單線程模型雖然對JavaScript構(gòu)成了很大的限制,但也因此使它具備了其他語言不具備的優(yōu)勢壤躲。如果部署得好备燃,JavaScript程序是不會出現(xiàn)堵塞的并齐,這就是為什么node.js平臺可以用很少的資源,應(yīng)付大流量訪問的原因撕贞。
(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捏膨,一起剝皮案震驚了整個濱河市食侮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锯七,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件久又,死亡現(xiàn)場離奇詭異,居然都是意外死亡炉峰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半夷,“玉大人,你說我怎么就攤上這事淘邻。” “怎么了宾舅?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵筹我,是天一觀的道長帆离。 經(jīng)常有香客問我,道長岸夯,這世上最難降的妖魔是什么呼巷? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任王悍,我火速辦了婚禮压储,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘集惋。我一直安慰自己踩娘,他們只是感情好喉祭,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布泛烙。 她就那樣靜靜地躺著翘紊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹉究。 梳的紋絲不亂的頭發(fā)上自赔,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天柳琢,我揣著相機與錄音,去河邊找鬼痘绎。 笑死肖粮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的行施。 我是一名探鬼主播魂那,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲜结!你這毒婦竟也來了精刷?” 一聲冷哼從身側(cè)響起蔗候,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纫事,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丽惶,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年诉字,在試婚紗的時候發(fā)現(xiàn)自己被綠了壤圃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅轧。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冲杀,靈堂內(nèi)的尸體忽然破棺而出睹酌,到底是詐尸還是另有隱情,我是刑警寧澤旺芽,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布采章,位于F島的核電站壶辜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抵怎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一便贵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚌本,春花似錦、人聲如沸程癌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锐峭。三九已至沿癞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惫搏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工筐赔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茴丰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像失仁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子控轿,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容