Event Loop

Event Loop 是一個(gè)很重要的概念,指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制
JavaScript語(yǔ)言就采用這種機(jī)制,來(lái)解決單線程運(yùn)行帶來(lái)的一些問(wèn)題

1.png

想要理解Event Loop肪笋,就要從程序的運(yùn)行模式講起牡辽。運(yùn)行以后的程序叫做"進(jìn)程"(process),一般情況下越除,一個(gè)進(jìn)程一次只能執(zhí)行一個(gè)任務(wù)节腐。

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

  • 排隊(duì)翼雀。因?yàn)橐粋€(gè)進(jìn)程一次只能執(zhí)行一個(gè)任務(wù)饱苟,只好等前面的任務(wù)執(zhí)行完了,再執(zhí)行后面的任務(wù)狼渊。
  • 新建進(jìn)程箱熬。使用fork命令,為每個(gè)任務(wù)新建一個(gè)進(jìn)程狈邑。
  • 新建線程城须。因?yàn)檫M(jìn)程太耗費(fèi)資源,所以如今的程序往往允許一個(gè)進(jìn)程包含多個(gè)線程官地,由線程去完成任務(wù)酿傍。

以JavaScript語(yǔ)言為例,它是一種單線程語(yǔ)言驱入,所有任務(wù)都在一個(gè)線程上完成赤炒,即采用上面的第一種方法。一旦遇到大量任務(wù)或者遇到一個(gè)耗時(shí)的任務(wù)亏较,網(wǎng)頁(yè)就會(huì)出現(xiàn)"假死"莺褒,因?yàn)镴avaScript停不下來(lái),也就無(wú)法響應(yīng)用戶(hù)的行為雪情。

你也許會(huì)問(wèn)遵岩,JavaScript為什么是單線程,難道不能實(shí)現(xiàn)為多線程嗎巡通?

這跟歷史有關(guān)系尘执。JavaScript從誕生起就是單線程。原因大概是不想讓瀏覽器變得太復(fù)雜宴凉,因?yàn)槎嗑€程需要共享資源誊锭、且有可能修改彼此的運(yùn)行結(jié)果,對(duì)于一種網(wǎng)頁(yè)腳本語(yǔ)言來(lái)說(shuō)弥锄,這就太復(fù)雜了丧靡。后來(lái)就約定俗成,JavaScript為一種單線程語(yǔ)言籽暇。(Worker API可以實(shí)現(xiàn)多線程温治,但是JavaScript本身始終是單線程的。)

如果某個(gè)任務(wù)很耗時(shí)戒悠,比如涉及很多I/O(輸入/輸出)操作熬荆,那么線程的運(yùn)行大概是下面的樣子。


2.png

上圖的綠色部分是程序的運(yùn)行時(shí)間绸狐,紅色部分是等待時(shí)間惶看∧笏常可以看到六孵,由于I/O操作很慢纬黎,所以這個(gè)線程的大部分運(yùn)行時(shí)間都在空等I/O操作的返回結(jié)果。這種運(yùn)行方式稱(chēng)為"同步模式"(synchronous I/O)或"堵塞模式"(blocking I/O)劫窒。

如果采用多線程本今,同時(shí)運(yùn)行多個(gè)任務(wù),那很可能就是下面這樣主巍。


3.png

上圖表明冠息,多線程不僅占用多倍的系統(tǒng)資源,也閑置多倍的資源孕索,這顯然不合理逛艰。

Event Loop就是為了解決這個(gè)問(wèn)題而提出的。[Wikipedia]這樣定義:

  • "Event Loop是一個(gè)程序結(jié)構(gòu)搞旭,用于等待和發(fā)送消息和事件散怖。(a programming construct that waits for and dispatches events or messages in a program.)"

簡(jiǎn)單說(shuō),就是在程序中設(shè)置兩個(gè)線程:一個(gè)負(fù)責(zé)程序本身的運(yùn)行肄渗,稱(chēng)為"主線程"镇眷;另一個(gè)負(fù)責(zé)主線程與其他進(jìn)程(主要是各種I/O操作)的通信,被稱(chēng)為"Event Loop線程"(可以譯為"消息線程")翎嫡。


4.png

上圖主線程的綠色部分欠动,還是表示運(yùn)行時(shí)間,而橙色部分表示空閑時(shí)間惑申。每當(dāng)遇到I/O的時(shí)候具伍,主線程就讓Event Loop線程去通知相應(yīng)的I/O程序,然后接著往后運(yùn)行圈驼,所以不存在紅色的等待時(shí)間人芽。等到I/O程序完成操作,Event Loop線程再把結(jié)果返回主線程碗脊。主線程就調(diào)用事先設(shè)定的回調(diào)函數(shù)啼肩,完成整個(gè)任務(wù)。

可以看到衙伶,由于多出了橙色的空閑時(shí)間祈坠,所以主線程得以運(yùn)行更多的任務(wù),這就提高了效率矢劲。這種運(yùn)行方式稱(chēng)為"異步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)赦拘。

這正是JavaScript語(yǔ)言的運(yùn)行方式。單線程模型雖然對(duì)JavaScript構(gòu)成了很大的限制芬沉,但也因此使它具備了其他語(yǔ)言不具備的優(yōu)勢(shì)躺同。如果部署得好阁猜,JavaScript程序是不會(huì)出現(xiàn)堵塞的,這就是為什么node.js平臺(tái)可以用很少的資源蹋艺,應(yīng)付大流量訪問(wèn)的原因剃袍。

https://www.cnblogs.com/hanzhecheng/p/9046144.html JS中EventLoop事件循環(huán)機(jī)制

Event Loop 是什么
JavaScript的事件分兩種,宏任務(wù)(macro-task)和微任務(wù)(micro-task)

  • 宏任務(wù):包括整體代碼script捎谨,setTimeout民效,setInterval
  • 微任務(wù):Promise.then(非new Promise),process.nextTick(node中)
  • 事件的執(zhí)行順序涛救,是先執(zhí)行宏任務(wù)畏邢,然后執(zhí)行微任務(wù),這個(gè)是基礎(chǔ)检吆,任務(wù)可以有同步任務(wù)和異步任務(wù)舒萎,同步的進(jìn)入主線程,異步的進(jìn)入Event Table并注冊(cè)函數(shù)蹭沛,異步事件完成后臂寝,會(huì)將回調(diào)函數(shù)放入Event Queue中(宏任務(wù)和微任務(wù)是不同的Event Queue),同步任務(wù)執(zhí)行完成后致板,會(huì)從Event Queue中讀取事件放入主線程執(zhí)行交煞,回調(diào)函數(shù)中可能還會(huì)包含不同的任務(wù),因此會(huì)循環(huán)執(zhí)行上述操作斟或。

https://www.cnblogs.com/mcray/p/6938417.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末素征,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萝挤,更是在濱河造成了極大的恐慌御毅,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怜珍,死亡現(xiàn)場(chǎng)離奇詭異端蛆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酥泛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)今豆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人柔袁,你說(shuō)我怎么就攤上這事呆躲。” “怎么了捶索?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵插掂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辅甥,這世上最難降的妖魔是什么酝润? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮璃弄,結(jié)果婚禮上要销,老公的妹妹穿的比我還像新娘。我一直安慰自己谢揪,他們只是感情好蕉陋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拨扶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茁肠。 梳的紋絲不亂的頭發(fā)上患民,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音垦梆,去河邊找鬼匹颤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛托猩,可吹牛的內(nèi)容都是我干的印蓖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼京腥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赦肃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起公浪,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤他宛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后欠气,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厅各,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年预柒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了队塘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宜鸯,死狀恐怖憔古,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顾翼,我是刑警寧澤投放,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站适贸,受9級(jí)特大地震影響灸芳,放射性物質(zhì)發(fā)生泄漏僻族。R本人自食惡果不足惜舔痕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暇韧,春花似錦、人聲如沸众弓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)批狱。三九已至裸准,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赔硫,已是汗流浹背炒俱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爪膊,地道東北人权悟。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像推盛,于是被迫代替她去往敵國(guó)和親峦阁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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