event loop線程

參考:
阮一峰e(cuò)vent loop
MDN Concurrency model and Event Loop
阮一峰線程和進(jìn)程概念
javascript Event Loop機(jī)制詳解

線程和進(jìn)程

進(jìn)程是指CPU所能處理的單個(gè)任務(wù)分瘾,任一時(shí)刻偎谁,CPU總是運(yùn)行一個(gè)進(jìn)程,而一個(gè)進(jìn)程里可以有幾個(gè)線程邑时,幾個(gè)線程同時(shí)進(jìn)行粱侣,協(xié)同完成一個(gè)任務(wù)汛闸。

什么是event loop核无?琉用?

事件循環(huán)
簡(jiǎn)單說舷蟀,就是在程序中設(shè)置兩個(gè)線程:一個(gè)負(fù)責(zé)程序本身的運(yùn)行楚昭,稱為”主線程”剂公;另一個(gè)負(fù)責(zé)主線程與其他進(jìn)程(主要是各種I/O操作)的通信沫浆,被稱為”Event Loop線程”(可以譯為”消息線程”)
像javascript就是基于單線程的運(yùn)行機(jī)制情妖,這種模型與其他語言如c吮廉,java就有非常明顯的區(qū)別曲聂。

任務(wù)隊(duì)列

javascript的單線程就意味著所有的任務(wù)都需要排隊(duì)递惋,前一個(gè)執(zhí)行完后一個(gè)才會(huì)執(zhí)行柔滔。

image.png

這樣看來,其實(shí)等待的時(shí)間甚至有時(shí)候會(huì)多于執(zhí)行的時(shí)間萍虽,造成cpu空等并且后面的事項(xiàng)又很緊急等待的情況睛廊。
這時(shí),javascript語言的設(shè)計(jì)者就了解到杉编,可以先掛起正在等待返回的任務(wù)超全,先執(zhí)行后面的任務(wù)

image.png

于是,所有任務(wù)就可以分為兩種邓馒,同步任務(wù)和異步任務(wù)嘶朱。同步任務(wù)是指主線程上的任務(wù),只有前一個(gè)任務(wù)執(zhí)行完畢才能執(zhí)行后一個(gè)任務(wù)光酣;異步任務(wù)是指不進(jìn)入主線程疏遏,進(jìn)入’任務(wù)隊(duì)列‘的任務(wù)。

任務(wù)隊(duì)列中的事件
image.png

像這樣的機(jī)制通常運(yùn)用在一些不是可以立即執(zhí)行的,比如用戶產(chǎn)生的時(shí)間财异,只要有指定回調(diào)函數(shù)倘零,這些事件就會(huì)進(jìn)入“任務(wù)隊(duì)列”,等待主線程完成后進(jìn)行讀取戳寸。
任務(wù)隊(duì)列也是先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)呈驶。

異步任務(wù)的事件

除此之外,只要是有回調(diào)函數(shù)的事件疫鹊,就幾乎都是異步事件袖瞻,會(huì)被放進(jìn)任務(wù)隊(duì)列中。拿setTimeout()事件來說拆吆,這是最經(jīng)典的事件了聋迎。
setTimeout()接收兩個(gè)參數(shù),第一個(gè)是回調(diào)函數(shù)锈拨,第二個(gè)是延遲時(shí)間
然而砌庄,在下面的例子中你會(huì)發(fā)現(xiàn)羹唠,即使延遲時(shí)間為0奕枢,還是相同的結(jié)果,這就是因?yàn)槿蝿?wù)隊(duì)列中的事件需要在主線程完成之后再執(zhí)行佩微,通過這樣我們也可以看到缝彬,如果主線程任務(wù)很多,定時(shí)器的延遲時(shí)間比較短哺眯,就會(huì)出現(xiàn)不準(zhǔn)的情況谷浅。

    var m = 1;
    var n = 2;
    setTimeout(function() {
          console.log(m);
    }, 0);
    console.log(n);

    //2
    //1

小試題

在一篇帖子看到的,剛開始還想不明白ヽ(≧□≦)ノ奶卓。
摘錄下來一疯。

    function foo() {
console.log('1');
bar();
setTimeout(function() {
    console.log('2');
}, 0);
Promise.resolve().then(function() {
    console.log('3');
    Promise.resolve().then(function() {
        console.log('4');
    });
});
console.log('5');
}

function bar() {
setTimeout(function() {
    console.log('6');
  }, 0);
setTimeout(function() {
    console.log('7');
  }, 0);
}

foo();

哈哈哈公布答案

image.png
Q:剛開始不明白的是為什么2是排在6和7的后面,明明bar()里面的setTimeout比直接setTimeout多一個(gè)調(diào)用級(jí)別夺姑?

后來想到墩邀,在一次調(diào)用bar()后,進(jìn)入bar()函數(shù)里面盏浙,就要把該函數(shù)里的進(jìn)程運(yùn)行結(jié)束才會(huì)返回眉睹,所以bar()函數(shù)里面的setTimeout要運(yùn)行結(jié)束才會(huì)出來繼續(xù)執(zhí)行任務(wù)隊(duì)列里接下來的其他任務(wù)。

  • 2 一個(gè)for循環(huán)添加事件

           function send(argument) {
          console.log(argument);
      }
      var m = document.getElementById('ok');
      for (var i = 0; i < 5; i++) {
          console.log(i);   //0废膘,1竹海,2,3丐黄,4
          m.addEventListener('click', function () {
              console.log(i)   //5斋配,5,5,5艰争,5
          }) 
      }
    
這里看到不一樣的輸出結(jié)果十偶,這有兩方面的原因

1 是因?yàn)関ar聲明的變量存在變量提升的問題
2 是因?yàn)閖s單線程所以動(dòng)態(tài)添加事件的事件被掛起,直到主線程結(jié)束
解決的辦法很簡(jiǎn)單园细,把var改為let惦积,就不存在變量提升的問題∶推担或者也可以從事件掛起的角度出發(fā)狮崩,找其他的解決辦法如閉包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鹿寻,隨后出現(xiàn)的幾起案子睦柴,更是在濱河造成了極大的恐慌,老刑警劉巖毡熏,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坦敌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痢法,警方通過查閱死者的電腦和手機(jī)狱窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來财搁,“玉大人蘸炸,你說我怎么就攤上這事〖獗迹” “怎么了搭儒?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)提茁。 經(jīng)常有香客問我淹禾,道長(zhǎng),這世上最難降的妖魔是什么茴扁? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任铃岔,我火速辦了婚禮,結(jié)果婚禮上丹弱,老公的妹妹穿的比我還像新娘德撬。我一直安慰自己,他們只是感情好躲胳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布蜓洪。 她就那樣靜靜地躺著,像睡著了一般坯苹。 火紅的嫁衣襯著肌膚如雪隆檀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音恐仑,去河邊找鬼泉坐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裳仆,可吹牛的內(nèi)容都是我干的腕让。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歧斟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼纯丸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起静袖,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤觉鼻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后队橙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坠陈,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年捐康,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仇矾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吹由,死狀恐怖若未,靈堂內(nèi)的尸體忽然破棺而出朱嘴,到底是詐尸還是另有隱情倾鲫,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布萍嬉,位于F島的核電站乌昔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏壤追。R本人自食惡果不足惜磕道,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望行冰。 院中可真熱鬧溺蕉,春花似錦、人聲如沸悼做。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肛走。三九已至漓雅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邻吞。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工组题, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抱冷。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓崔列,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親旺遮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峻呕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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