91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JAVASCRIPT與單個(gè)線程的工作

汽車(chē)玩家 ? 來(lái)源:今日頭條 ? 作者:魏建民 ? 2020-05-05 22:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

事件循環(huán)是用來(lái)理解JavaScript的最重要的方面之一。這篇文章旨在解釋JavaScript如何與單個(gè)線程一起工作的細(xì)節(jié),以及它如何處理異步函數(shù)。

JavaScript代碼運(yùn)行是單線程。一次只執(zhí)行一件事。這實(shí)際上是一個(gè)非常有用的限制,因?yàn)樗?jiǎn)化了很多程序,從而不必?fù)?dān)心并發(fā)問(wèn)題。

您只需要注意編寫(xiě)代碼的方式,避免任何可能阻塞線程的內(nèi)容,如同步調(diào)用或無(wú)限循環(huán)。

通常,在大多數(shù)瀏覽器中,每個(gè)瀏覽器都有一個(gè)事件循環(huán),以使每個(gè)進(jìn)程隔離,并避免web頁(yè)面具有無(wú)限循環(huán)或繁重的處理來(lái)阻塞整個(gè)瀏覽器。

你最需要擔(dān)心的是,您的代碼將在單個(gè)事件循環(huán)上運(yùn)行,并在編寫(xiě)代碼時(shí)考慮到這一點(diǎn),以避免阻塞它。

阻止事件循環(huán)

任何花費(fèi)太長(zhǎng)時(shí)間將控制權(quán)返回給事件循環(huán)的JavaScript代碼都會(huì)阻止頁(yè)面中任何JavaScript代碼的執(zhí)行,甚至阻止UI線程,用戶也無(wú)法點(diǎn)擊,滾動(dòng)頁(yè)面等等。

幾乎所有JavaScript中的I / O操作都是非阻塞的。網(wǎng)絡(luò)請(qǐng)求,Node.js文件系統(tǒng)操作等。阻塞是個(gè)例外,這就是為什么JavaScript基于回調(diào),以及最近的promises和async / await。

調(diào)用堆棧

調(diào)用堆棧是LIFO隊(duì)列(Last In,F(xiàn)irstOut)。事件循環(huán)不斷檢查調(diào)用堆棧以查看是否存在需要運(yùn)行的任何函數(shù)。

在執(zhí)行此操作時(shí),它會(huì)將它找到的任何函數(shù)調(diào)用添加到調(diào)用堆棧并按順序執(zhí)行每個(gè)調(diào)用。

一個(gè)簡(jiǎn)單的事件循環(huán)說(shuō)明:

JAVASCRIPT與單個(gè)線程的工作

當(dāng)此代碼運(yùn)行時(shí),首先f(wàn)oo()調(diào)用。在foo()我們第一次調(diào)用bar(),然后我們調(diào)用baz()。

排隊(duì)功能執(zhí)行

上面的例子運(yùn)行特點(diǎn):JavaScript找到要執(zhí)行的東西,按順序運(yùn)行它們。

讓我們看看如何推遲函數(shù)直到堆棧清除:

用例setTimeout(()=> {}), 0)是調(diào)用一個(gè)函數(shù),但是一旦執(zhí)行了代碼中的每個(gè)其他函數(shù)就執(zhí)行它。

JAVASCRIPT與單個(gè)線程的工作

當(dāng)此代碼運(yùn)行時(shí),首先調(diào)用foo()。在foo()里面我們首先調(diào)用setTimeout,bar作為參數(shù)傳遞,然后我們指示它盡可能快地運(yùn)行,將0作為計(jì)時(shí)器傳遞。然后我們調(diào)用baz()。

消息隊(duì)列

調(diào)用setTimeout()時(shí),瀏覽器或Node.js啟動(dòng)計(jì)時(shí)器。當(dāng)計(jì)時(shí)器到期,我們將0作為超時(shí),回調(diào)函數(shù)立即被放入消息隊(duì)列中。

消息隊(duì)列也是用戶發(fā)起的事件(如單擊事件、鍵盤(pán)事件或獲取響應(yīng))在代碼有機(jī)會(huì)對(duì)其作出響應(yīng)之前排隊(duì)的地方?;蛘呦駉nLoad這樣的DOM事件。

循環(huán)優(yōu)先處理調(diào)用堆棧,它首先處理在調(diào)用堆棧中找到的所有東西,一旦調(diào)用堆棧中沒(méi)有任何東西,它就會(huì)去獲取事件隊(duì)列中的東西。

我們不必等待像setTimeout,fetch或其他東西這樣的函數(shù)來(lái)完成自己的工作,因?yàn)樗鼈兪怯蔀g覽器提供的,并且它們運(yùn)行在自己的線程中。

ES6作業(yè)隊(duì)列

ECMAScript 2015引入了Promises使用的作業(yè)隊(duì)列概念(也在ES6 / ES2015中引入)。這是一種盡快執(zhí)行異步函數(shù)結(jié)果的方法,而不是放在調(diào)用堆棧的末尾。

在當(dāng)前函數(shù)結(jié)束之前解析的Prom將在當(dāng)前函數(shù)之后立即執(zhí)行。

我覺(jué)得在游樂(lè)園里過(guò)山車(chē)的比喻很好:消息隊(duì)列將你放在隊(duì)列的后面,在所有其他人的后面,你將不得不等待輪到你,而作業(yè)隊(duì)列是快速通票這可以讓你在完成上一個(gè)之后再騎一次。

JAVASCRIPT與單個(gè)線程的工作

這是Promises(和Async / await,它建立在promises上)和普通的舊異步函數(shù)setTimeout()或其他平臺(tái)API 之間的巨大差異。

javascrit的事件循環(huán)是這門(mén)語(yǔ)言中非常重要且基礎(chǔ)的概念。清楚的了解了事件循環(huán)的執(zhí)行順序和每一個(gè)階段的特點(diǎn),可以使我們對(duì)一段異步代碼的執(zhí)行順序有一個(gè)清晰的認(rèn)識(shí),從而減少代碼運(yùn)行的不確定性。合理的使用各種延遲事件的方法,有助于代碼更好的按照其優(yōu)先級(jí)去執(zhí)行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1304

    瀏覽量

    74452
  • javascript
    +關(guān)注

    關(guān)注

    0

    文章

    526

    瀏覽量

    56321
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    摩爾線程正式開(kāi)源TileLang-MUSA項(xiàng)目

    近日,摩爾線程正式開(kāi)源TileLang-MUSA項(xiàng)目,實(shí)現(xiàn)對(duì)TileLang編程語(yǔ)言的完整支持。該項(xiàng)目已成功在摩爾線程多代全功能GPU上完成功能驗(yàn)證與特性開(kāi)發(fā),旨在通過(guò)高層抽象與編譯器優(yōu)化,大幅降低開(kāi)發(fā)門(mén)檻,為國(guó)產(chǎn)算力平臺(tái)提供更高效的AI與高性能計(jì)算開(kāi)發(fā)體驗(yàn)。
    的頭像 發(fā)表于 02-11 16:57 ?1242次閱讀

    解析Linux的進(jìn)程、線程和協(xié)程

    允許在單個(gè)線程內(nèi)實(shí)現(xiàn)多個(gè)協(xié)程的并發(fā)執(zhí)行。協(xié)程在執(zhí)行過(guò)程中可以主動(dòng)掛起和恢復(fù),這使得編寫(xiě)高效的異步代碼變得更加容易。協(xié)程通常用于處理I/O密集型任務(wù),能夠提高程序的響應(yīng)性能。 協(xié)程的特點(diǎn)包括: (1
    發(fā)表于 12-22 11:00

    線程的系統(tǒng)

    線程系統(tǒng)的事件響應(yīng)也是在中斷中完成的,但事件的處理是在線程中完成的。在多線程系統(tǒng)中,線程跟中斷一樣,也具有優(yōu)先級(jí),優(yōu)先級(jí)高的線程會(huì)被優(yōu)先執(zhí)
    發(fā)表于 12-08 07:55

    Linux多線程對(duì)比單線程的優(yōu)勢(shì)

    在Linux系統(tǒng)中,線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。線程被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)行單位。一個(gè)進(jìn)程可以擁有多個(gè)線程,這些線程共享相同的內(nèi)存空間和系統(tǒng)資源。
    發(fā)表于 12-01 06:11

    國(guó)家信息中心與摩爾線程達(dá)成戰(zhàn)略合作

    10月21日上午,國(guó)家信息中心與摩爾線程在北京舉行戰(zhàn)略合作協(xié)議簽約儀式。國(guó)家信息中心主任徐強(qiáng),摩爾線程創(chuàng)始人、董事長(zhǎng)兼首席執(zhí)行官?gòu)埥ㄖ谐鱿灱s儀式。國(guó)家信息中心副主任周民與摩爾線程聯(lián)合創(chuàng)始人兼首席運(yùn)營(yíng)官周苑代表雙方簽署戰(zhàn)略合作協(xié)
    的頭像 發(fā)表于 10-23 15:52 ?543次閱讀

    rtt中建兩個(gè)線程a和b,怎么確保線程a執(zhí)行完立刻切到線程b?

    怎么獲取從線程開(kāi)始切換到切換完成用的總的CPU時(shí)鐘節(jié)拍數(shù)量?
    發(fā)表于 10-10 06:37

    tcpip線程被mu0鎖住導(dǎo)致網(wǎng)絡(luò)線程無(wú)法使用怎么解決?

    各位好,我使用rtthread開(kāi)發(fā)STM32F407VGT6芯片,程序有多個(gè)線程,每個(gè)線程都會(huì)創(chuàng)建一個(gè)socket,建立tcp連接或者udp連接,現(xiàn)在出現(xiàn)一個(gè)問(wèn)題,程序長(zhǎng)時(shí)間運(yùn)行有概率死機(jī),但是沒(méi)有
    發(fā)表于 09-29 06:41

    線程刪除時(shí)遇到斷言,是什么原因?qū)е碌模?/a>

    在一個(gè)線程中調(diào)用線程刪除函數(shù)刪除另外一個(gè)線程,這2個(gè)線程的優(yōu)先級(jí)是相等的,被刪除的線程也是動(dòng)態(tài)創(chuàng)建的,出現(xiàn)了下面的斷言內(nèi)容,一般是什么情況導(dǎo)
    發(fā)表于 09-12 06:08

    rtth studio中nano 如何創(chuàng)建動(dòng)態(tài)線程?

    有沒(méi)有大佬,可以說(shuō)一下為什么靜態(tài)線程可以正常使用,動(dòng)態(tài)線程怎么也使用不了。 具體需要什么配置才能使用動(dòng)態(tài)線程創(chuàng)建。謝謝!
    發(fā)表于 09-11 06:01

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】—— linux創(chuàng)建線程

    自己的私有資源。 在linux系統(tǒng)中,線程狀態(tài)通常反映了當(dāng)前線程的當(dāng)前活動(dòng)和執(zhí)行階段。 主要分為: 1。運(yùn)行轉(zhuǎn)態(tài) 2。阻塞轉(zhuǎn)態(tài) 3。終止?fàn)顟B(tài) 如何區(qū)分單線程和多線程? 在
    發(fā)表于 09-01 21:31

    rtt studio中nano 如何創(chuàng)建動(dòng)態(tài)線程?

    有沒(méi)有大佬,可以說(shuō)一下為什么靜態(tài)線程可以正常使用,動(dòng)態(tài)線程怎么也使用不了。 具體需要什么配置才能使用動(dòng)態(tài)線程創(chuàng)建。謝謝!
    發(fā)表于 08-22 06:19

    UVC+MSC實(shí)現(xiàn)中MSC線程未運(yùn)行的原因?

    我正在嘗試使用 EZUSB 運(yùn)行 UVC + MSC。我有以下內(nèi)容。但看起來(lái)只有 UVC 線程在運(yùn)行,而 MSC 沒(méi)有運(yùn)行。fw 不響應(yīng) MSC 命令。我確保 LPM 已被禁用,只是為了檢查傳感器
    發(fā)表于 07-16 07:08

    深度剖析 RT-Thread 線程調(diào)度流程

    RT-Thread調(diào)度第一個(gè)線程的主要流程分如下:rtthread_startup:RTT的啟動(dòng)函數(shù),主要負(fù)責(zé)板級(jí)驅(qū)動(dòng),調(diào)度器,系統(tǒng)線程初始化,啟動(dòng)調(diào)度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1767次閱讀
    深度剖析 RT-Thread <b class='flag-5'>線程</b>調(diào)度流程

    線程的安全注意事項(xiàng)

    線程安全是指多個(gè)線程同時(shí)訪問(wèn)或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開(kāi)發(fā)者選擇TaskPool或Worker進(jìn)行多線程開(kāi)發(fā)時(shí),在TaskPool和Worker的工作
    發(fā)表于 06-20 07:49

    RTOS如何在FX3中工作?

    大家好, 我正在使用 FX3 進(jìn)行一個(gè)項(xiàng)目。 我想知道 RTOS 調(diào)度是如何工作的。 我知道調(diào)用“CyU3PKernelEntry();”后 RTOS 就會(huì)開(kāi)始工作。 如果我只注冊(cè)一個(gè)應(yīng)用程序線程。 我的
    發(fā)表于 05-06 13:20