站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        什么是事件循環(huán)?詳解Node.js中的事件循環(huán)

        什么是事件循環(huán)?本篇文章給大家介紹一下Node中的事件循環(huán),希望對(duì)大家有所幫助!

        什么是事件循環(huán)?詳解Node.js中的事件循環(huán)

        什么是事件循環(huán)?

        盡管JavaScript是單線程的,但是事件循環(huán)盡可能的使用系統(tǒng)內(nèi)核允許Node.js執(zhí)行非阻塞I/O操作 盡管大部分現(xiàn)代內(nèi)核是多線程的,他們可以在后臺(tái)處理多線程任務(wù)。當(dāng)一個(gè)任務(wù)完成時(shí),內(nèi)核告訴Node.js,然后適當(dāng)?shù)幕卣{(diào)會(huì)被加入到循環(huán)中執(zhí)行,這篇文章會(huì)進(jìn)一步詳細(xì)的介紹這個(gè)話題

        時(shí)間循環(huán)解釋

        當(dāng)Node.js開始執(zhí)行時(shí),首先會(huì)初始化事件循環(huán),處理提供的輸入腳本(或者放入REPL,本文檔未涉及)這會(huì)執(zhí)行異步 API調(diào)用,調(diào)度計(jì)時(shí)器,或調(diào)用 process.nextTick(),然后開始處理事件循環(huán)

        下圖展示了事件循環(huán)執(zhí)行順序的簡(jiǎn)化概覽

           ┌───────────────────────────┐ ┌─>│           timers          │ │  └─────────────┬─────────────┘ │  ┌─────────────┴─────────────┐ │  │     pending callbacks     │ │  └─────────────┬─────────────┘ │  ┌─────────────┴─────────────┐ │  │       idle, prepare       │ │  └─────────────┬─────────────┘      ┌───────────────┐ │  ┌─────────────┴─────────────┐      │   incoming:   │ │  │           poll            │<─────┤  connections, │ │  └─────────────┬─────────────┘      │   data, etc.  │ │  ┌─────────────┴─────────────┐      └───────────────┘ │  │           check           │ │  └─────────────┬─────────────┘ │  ┌─────────────┴─────────────┐ └──┤      close callbacks      │    └───────────────────────────┘

        每一個(gè)盒子代表著事件循環(huán)的一個(gè)階段

        每一個(gè)階段有一個(gè)FIFO的隊(duì)列 callback 執(zhí)行,然而每一個(gè)階段基于它自己的方式執(zhí)行,總體來講,當(dāng)事件循環(huán)進(jìn)入到一個(gè)階段里,它將執(zhí)行當(dāng)前階段的任何操作,開始執(zhí)行當(dāng)前階段隊(duì)列中的回調(diào)直到隊(duì)列完全消耗完或者執(zhí)行到隊(duì)列的最大數(shù)據(jù)。當(dāng)隊(duì)列消耗完或者達(dá)到最大數(shù)量,事件循環(huán)就會(huì)移動(dòng)到下一個(gè)階段。

        階段概述

        • timers 這個(gè)階段執(zhí)行 setTimeout() 和 setInterval() 的回調(diào)
        • pending callbacks 執(zhí)行 I/O 回調(diào)推遲到下一個(gè)循環(huán)迭代
        • idle,prepare 僅在內(nèi)部使用
        • poll 檢索新的 I/O 事件;執(zhí)行 I/O 相關(guān)的回調(diào)(幾乎所有相關(guān)的回調(diào),關(guān)閉回調(diào),)
        • check setImmediate() 會(huì)在此階段調(diào)用
        • close callbacks 關(guān)閉回調(diào),例如: socket.on('close', …)

        在事件循環(huán)的每個(gè)過程中,Node.js檢查是否它正在等待異步的I/O和計(jì)時(shí)器,如果沒有則完全關(guān)閉

        階段詳情

        timer

        一個(gè)計(jì)時(shí)器指定一個(gè)回調(diào)會(huì)被執(zhí)行的臨界點(diǎn),而不是人們想讓它執(zhí)行的時(shí)間,計(jì)時(shí)器會(huì)在指定的過去時(shí)間之后盡可能早的執(zhí)行,然而,操作系統(tǒng)調(diào)度或者其他回調(diào)會(huì)讓它延遲執(zhí)行。

        從技術(shù)角度上講,poll 階段決定了回調(diào)何時(shí)執(zhí)行

        例如,你設(shè)置了一個(gè)計(jì)時(shí)器,100 ms之后執(zhí)行,然而你的腳本異步讀取了一個(gè)文件花費(fèi)了 95ms

        const fs = require('fs');  function someAsyncOperation(callback) {   // Assume this takes 95ms to complete   fs.readFile('/path/to/file', callback); }  const timeoutScheduled = Date.now();  setTimeout(() => {   const delay = Date.now() - timeoutScheduled;    console.log(`${delay}ms have passed since I was scheduled`); }, 100);  // do someAsyncOperation which takes 95 ms to complete someAsyncOperation(() => {   const startCallback = Date.now();    // do something that will take 10ms...   while (Date.now() - startCallback < 10) {     // do nothing   } });

        當(dāng)事件循環(huán)進(jìn)入了 poll 階段,是一個(gè)空的隊(duì)列,(fs.readFile() 還沒有完成),因此它會(huì)等待剩余的毫秒數(shù)直到最快的計(jì)時(shí)器閾值到達(dá),當(dāng)95 ms之后,fs.readFile() 完成了讀文件并且會(huì)花費(fèi)10 ms完成添加到poll 階段并且執(zhí)行完畢,當(dāng)回調(diào)完成,隊(duì)列中沒有回調(diào)要執(zhí)行了,事件循環(huán)循環(huán)返回到timers 階段,執(zhí)行計(jì)時(shí)器的回調(diào)。在這個(gè)例子中,你會(huì)看到計(jì)時(shí)器被延遲了105 ms之后執(zhí)行

        為了防止 poll 階段阻塞事件循環(huán),libuv(實(shí)現(xiàn)了事件循環(huán)和平臺(tái)上所有的異步行為的C語(yǔ)言庫(kù))在 poll 階段同樣也有一個(gè)最大值停止輪訓(xùn)

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 国产精品丝袜久久久久久不卡| 国产精品毛片a∨一区二区三区| 久久亚洲精品视频| 亚洲AV永久无码精品一区二区| 2022国产精品最新在线| 亚洲精品国产精品乱码不卡√ | 国产2021精品视频免费播放| 欧美精品免费专区在线观看| 麻豆精品久久精品色综合| 日韩精品人妻系列无码专区| 久久精品无码一区二区日韩AV| 秋霞午夜鲁丝片午夜精品久| 精品欧洲AV无码一区二区男男| 亚洲精品欧美精品日韩精品| 国产一区精品| 国产成人精品无人区一区| freesexvideos精品老师毛多| 亚洲欧美日韩国产精品专区 | 精品免费久久久久久久| 欧美亚洲另类精品第一页| 国产精品无码久久久久| 91po国产在线精品免费观看| 99热精品在线观看| 精品免费人成视频app| 无码人妻精品中文字幕免费| 中文字幕精品一区二区三区视频| 久久久久无码国产精品不卡| 精品少妇一区二区三区在线| 国产欧美日本精品| 国产精品亚洲综合专区片高清久久久 | 亚洲av永久无码精品漫画| 香港三级精品三级在线专区| 九九精品在线视频| 久久精品国产亚洲精品| 久久成人精品| 久久无码人妻精品一区二区三区| 国产精品青草视频免费播放| 国产精品性爱| 欧美精品在线视频| 在线精品亚洲一区二区小说| 亚洲欧美日韩久久精品第一区|