摘要:為了利用多核的計(jì)算能力,提出標(biāo)準(zhǔn),允許腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作。三異步執(zhí)行機(jī)制所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧。只要異步任務(wù)有了運(yùn)行結(jié)果,就在任務(wù)隊(duì)列之中放置一個(gè)事件。
一、為什么js是單線程
JavaScript語(yǔ)言的一大特點(diǎn)就是單線程,也就是說(shuō),同一個(gè)時(shí)間只能做一件事。那么,為什么JavaScript不能有多個(gè)線程呢?這樣能提高效率啊。
JavaScript的單線程,與它的用途有關(guān)。作為瀏覽器腳本語(yǔ)言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來(lái)很復(fù)雜的同步問(wèn)題。比如,假定JavaScript同時(shí)有兩個(gè)線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?
所以,為了避免復(fù)雜性,從一誕生,JavaScript就是單線程,這已經(jīng)成了這門(mén)語(yǔ)言的核心特征,將來(lái)也不會(huì)改變。
為了利用多核CPU的計(jì)算能力,HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作DOM。所以,這個(gè)新標(biāo)準(zhǔn)并沒(méi)有改變JavaScript單線程的本質(zhì)。
二、任務(wù)隊(duì)列單線程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會(huì)執(zhí)行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長(zhǎng),后一個(gè)任務(wù)就不得不一直等著。
如果排隊(duì)是因?yàn)橛?jì)算量大,CPU忙不過(guò)來(lái),倒也算了,但是很多時(shí)候CPU是閑著的,因?yàn)镮O設(shè)備(輸入輸出設(shè)備)很慢(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),不得不等著結(jié)果出來(lái),再往下執(zhí)行。
JavaScript語(yǔ)言的設(shè)計(jì)者意識(shí)到,這時(shí)主線程完全可以不管IO設(shè)備,掛起處于等待中的任務(wù),先運(yùn)行排在后面的任務(wù)。等到IO設(shè)備返回了結(jié)果,再回過(guò)頭,把掛起的任務(wù)繼續(xù)執(zhí)行下去。
于是,所有任務(wù)可以分成兩種,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。同步任務(wù)指的是,在主線程上排隊(duì)執(zhí)行的任務(wù),只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù);異步任務(wù)指的是,不進(jìn)入主線程、而進(jìn)入"任務(wù)隊(duì)列"(task queue)的任務(wù),只有"任務(wù)隊(duì)列"通知主線程,某個(gè)異步任務(wù)可以執(zhí)行了,該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行。
三、異步執(zhí)行機(jī)制1、所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧。
2、主線程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件。
3、一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開(kāi)始執(zhí)行。
4、主線程不斷重復(fù)上面的第三步。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91698.html
摘要:后面也寫(xiě)了幾種常見(jiàn)的排序算法,并用快排求第大值,另外如果之前版的作者看到的話可以留言,我會(huì)標(biāo)明文章引用。 之前實(shí)習(xí)筆試的時(shí)候刷題一直用的java,也參考某篇文章寫(xiě)過(guò)java版的二叉樹(shù)常見(jiàn)算法,因?yàn)轳R上要轉(zhuǎn)正面試了,這幾天都在準(zhǔn)備面試,就把之前的翻出來(lái)用javascript重新寫(xiě)了一遍,二叉樹(shù)基本都是遞歸處理的,也比較簡(jiǎn)單,就當(dāng)做熱身。后面也寫(xiě)了幾種常見(jiàn)的排序算法,并用快排求第K大值,另...
摘要:而模擬的方法返回的函數(shù)用作構(gòu)造函數(shù)時(shí),生成的對(duì)象為。同樣,使用運(yùn)算符時(shí),綁定構(gòu)造函數(shù)和未綁定構(gòu)造函數(shù)并無(wú)兩樣。標(biāo)準(zhǔn)的方法創(chuàng)建一個(gè)新函數(shù)稱為綁定函數(shù),新函數(shù)與被調(diào)函數(shù)綁定函數(shù)的目標(biāo)函數(shù)具有相同的函數(shù)體在規(guī)范中內(nèi)置的屬性。 這是一道面試題,題目給出了使用bind方法的樣例,要求用javascript實(shí)現(xiàn)這個(gè)方法,面試官還很善意的提醒我函數(shù)柯里化,然而,我還是不會(huì)這道題目,所以回來(lái)這會(huì)《ja...
摘要:連接開(kāi)啟你的服務(wù)首先確保你已安裝了,并且配置了的環(huán)境變量。此時(shí)再進(jìn)入文件夾,里面會(huì)有許多文件。創(chuàng)建連接新建一個(gè)任意目錄最好新建一個(gè)文件夾便于管理。連接錯(cuò)誤安裝依賴包,運(yùn)行此文件說(shuō)明已成功連接到數(shù)據(jù)庫(kù)。 連接 開(kāi)啟你的mongodb服務(wù) 首先確保你已安裝了mongodb,并且配置了mongodb的環(huán)境變量。在任意目錄(建議在非中文目錄)下新建database文件夾,在此文件夾下新建tes...
摘要:當(dāng)多個(gè)事件觸發(fā)的時(shí)候,會(huì)把異步事件依次的放入里等同步事件執(zhí)行完之后,再去隊(duì)列里一個(gè)個(gè)執(zhí)行拾遺常用方法總結(jié)面試的信心來(lái)源于過(guò)硬的基礎(chǔ)參考高級(jí)程序設(shè)計(jì)你所不知道的深入淺出知識(shí)點(diǎn)思維導(dǎo)圖經(jīng)典實(shí)例總結(jié)那些剪不斷理還亂的關(guān)系 持續(xù)不斷更新。。。 基本類型和引用類型 vue props | Primitive vs Reference Types 基本類型和字面值之間的區(qū)別 基本類型和字面值相等,...
Node.js從2009年誕生至今,已經(jīng)發(fā)展了兩年有余,其成長(zhǎng)的速度有目共睹。從在github的訪問(wèn)量超過(guò)Rails,到去年底Node.jsS創(chuàng)始人Ryan Dalh加盟Joyent獲得企業(yè)資助,再到今年發(fā)布Windows移植版本,Node.js的前景獲得了技術(shù)社區(qū)的肯定。InfoQ一直在關(guān)注Node.js的發(fā)展,在今年的兩次Qcon大會(huì)(北京站和杭州站)都有專門(mén)的講座。為了更好地促進(jìn)Node.j...
閱讀 3509·2021-11-23 10:13
閱讀 877·2021-09-22 16:01
閱讀 921·2021-09-09 09:33
閱讀 646·2021-08-05 09:58
閱讀 1729·2019-08-30 11:14
閱讀 1972·2019-08-30 11:02
閱讀 3280·2019-08-29 16:28
閱讀 1495·2019-08-29 16:09