什么是 Event Loop?

什么事event loop?

日期:2013年10月21日

[2014.10.08更新] 本文內容有錯誤驰怎,請參考新版本钞馁。

Event Loop 是一個很重要的概念虑省,指的是計算機系統(tǒng)的一種運行機制。

JavaScript語言就采用這種機制指攒,來解決單線程運行帶來的一些問題慷妙。

??????? 本文參考C. Aaron Cois的《Understanding The Node.js Event Loop》,解釋什么是Event Loop允悦,以及它與JavaScript語言的單線程模型有何關系膝擂。

想要理解Event Loop,就要從程序的運行模式講起隙弛。運行以后的程序叫做"進程"(process)架馋,一般情況下,一個進程一次只能執(zhí)行一個任務全闷。

如果有很多任務需要執(zhí)行叉寂,不外乎三種解決方法。


(1)排隊总珠。因為一個進程一次只能執(zhí)行一個任務屏鳍,只好等前面的任務執(zhí)行完了,再執(zhí)行后面的任務局服。

(2)新建進程钓瞭。使用fork命令,為每個任務新建一個進程淫奔。

(3)新建線程山涡。因為進程太耗費資源,所以如今的程序往往允許一個進程包含多個線程,由線程去完成任務鸭丛。(進程和線程的詳細解釋竞穷,請看這里。)



以JavaScript語言為例鳞溉,它是一種單線程語言瘾带,所有任務都在一個線程上完成,即采用上面的第一種方法穿挨。一旦遇到大量任務或者遇到一個耗時的任務月弛,網頁就會出現(xiàn)"假死",因為JavaScript停不下來科盛,也就無法響應用戶的行為。

你也許會問菜皂,JavaScript為什么是單線程贞绵,難道不能實現(xiàn)為多線程嗎?

這跟歷史有關系恍飘。JavaScript從誕生起就是單線程榨崩。原因大概是不想讓瀏覽器變得太復雜,因為多線程需要共享資源章母、且有可能修改彼此的運行結果母蛛,對于一種網頁腳本語言來說,這就太復雜了乳怎。后來就約定俗成彩郊,JavaScript為一種單線程語言。(WorkerAPI可以實現(xiàn)多線程蚪缀,但是JavaScript本身始終是單線程的秫逝。)如果某個任務很耗時,比如涉及很多I/O(輸入/輸出)操作询枚,那么線程的運行大概是下面的樣子违帆。

上圖的綠色部分是程序的運行時間,紅色部分是等待時間金蜀∷⒑螅可以看到,由于I/O操作很慢渊抄,所以這個線程的大部分運行時間都在空等I/O操作的返回結果尝胆。這種運行方式稱為"同步模式"(synchronous I/O)或"堵塞模式"(blocking I/O)。

如果采用多線程抒线,同時運行多個任務班巩,那很可能就是下面這樣。

上圖表明,多線程不僅占用多倍的系統(tǒng)資源抱慌,也閑置多倍的資源逊桦,這顯然不合理。

Event Loop就是為了解決這個問題而提出的抑进。Wikipedia這樣定義:

"Event Loop是一個程序結構强经,用于等待和發(fā)送消息和事件。(a programming construct that waits for and dispatches events or messages in a program.)"

簡單說寺渗,就是在程序中設置兩個線程:一個負責程序本身的運行匿情,稱為"主線程";另一個負責主線程與其他進程(主要是各種I/O操作)的通信信殊,被稱為"Event Loop線程"(可以譯為"消息線程")炬称。

????? 上圖主線程的綠色部分,還是表示運行時間涡拘,而橙色部分表示空閑時間玲躯。每當遇到I/O的時候,主線程就讓EventLoop線程去通知相應的I/O程序鳄乏,然后接著往后運行跷车,所以不存在紅色的等待時間。等到I/O程序完成操作橱野,EventLoop線程再把結果返回主線程朽缴。主線程就調用事先設定的回調函數,完成整個任務水援。

可以看到密强,由于多出了橙色的空閑時間,所以主線程得以運行更多的任務裹唆,這就提高了效率誓斥。這種運行方式稱為"異步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)。

這正是JavaScript語言的運行方式许帐。單線程模型雖然對JavaScript構成了很大的限制劳坑,但也因此使它具備了其他語言不具備的優(yōu)勢。如果部署得好成畦,JavaScript程序是不會出現(xiàn)堵塞的距芬,這就是為什么node.js平臺可以用很少的資源,應付大流量訪問的原因循帐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(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
  • 文/不壞的土叔 我叫張陵尼荆,是天一觀的道長左腔。 經常有香客問我,道長耀找,這世上最難降的妖魔是什么翔悠? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮野芒,結果婚禮上,老公的妹妹穿的比我還像新娘双炕。我一直安慰自己狞悲,他們只是感情好著榴,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布呈宇。 她就那樣靜靜地躺著醉箕,像睡著了一般监氢。 火紅的嫁衣襯著肌膚如雪航闺。 梳的紋絲不亂的頭發(fā)上买置,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天榆浓,我揣著相機與錄音菩混,去河邊找鬼死相。 笑死融求,一個胖子當著我的面吹牛,可吹牛的內容都是我干的算撮。 我是一名探鬼主播生宛,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肮柜!你這毒婦竟也來了陷舅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤审洞,失蹤者是張志新(化名)和其女友劉穎莱睁,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡仰剿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年创淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酥馍。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩昆,死狀恐怖,靈堂內的尸體忽然破棺而出旨袒,到底是詐尸還是另有隱情汁针,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布砚尽,位于F島的核電站施无,受9級特大地震影響,放射性物質發(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

推薦閱讀更多精彩內容

  • JavaScript 的線程機制 JavaScript有一個 主線程 和 Event Loop線程(消息線程) 1...
    anonymous66閱讀 304評論 0 1
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,088評論 0 1
  • node.js事件循環(huán) Node.js 是單進程單線程應用程序弛姜,但是通過事件和回調支持并發(fā)脐瑰,所以性能非常高。Nod...
    markfork閱讀 1,396評論 0 5
  • 野餐偶遇90歲高壽的國家隊運動員兼教練绝页,前天剛獨自從上海騎行到南京,今天早上看到難得的好天氣便...
    仨木閱讀 236評論 0 1
  • 氣象局通知: 原約定于今天來的暴雪寂恬,因半路資金不足续誉,耽誤了點兒時間,或許今天夜間趕到初肉。這場雪如果下大了肯定不小酷鸦,如...
    心悅不誠服閱讀 5,990評論 0 0