成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

node的事件機制

Faremax / 2929人閱讀

摘要:什么是事件循環(huán)盡管是單線程的,事件循環(huán)機制,通過在合適的時候把操作交給系統(tǒng)內(nèi)核,從而允許執(zhí)行非阻塞的操作當操作完成時,內(nèi)核告知,合適的回調(diào)函數(shù)會被加入輪詢隊列,最終被執(zhí)行。結(jié)果長時間的運行回調(diào)函數(shù)允許運行事件比的閾值更長。

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

盡管js是單線程的,事件循環(huán)機制,通過在合適的時候把操作交給系統(tǒng)內(nèi)核,從而允許node執(zhí)行非阻塞的io操作
當操作完成時,內(nèi)核告知node.js,合適的回調(diào)函數(shù)會被加入輪詢隊列,最終被執(zhí)行。
Node.js啟動的時候,初始化event loop,處理提供的腳本,腳本中可能調(diào)用異步API,調(diào)度timers,或者調(diào)用process.nextTick(),然后處理event loop

下圖是簡化的事件循環(huán)操作順序圖overview

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

圖中每個box就是一個phase,每個phase有一個先進先出的回調(diào)函數(shù)的隊列,
event loop進入了一個phase,就會執(zhí)行phase中所有的操作,然后執(zhí)行回調(diào)函數(shù),直到隊列耗盡了,或者回調(diào)函數(shù)執(zhí)行數(shù)量到達最大數(shù),接下來就去下一個phase

因為任何一個操作都可能調(diào)度更多的操作,而且poll phase中新的事件由內(nèi)核排隊,所以正在輪詢的事件在被處理的時候,poll事件們可能會排隊。
結(jié)果:長時間的運行回調(diào)函數(shù)允許poll phase運行事件比timer的閾值更長。

phase overview 階段概況

timers:執(zhí)行由setTimeout() and setInterval()調(diào)度的回調(diào)函數(shù)

I/O callbacks:執(zhí)行所有的回調(diào)函數(shù),除了 close callbacks(由timers,setImmediate()調(diào)度)

idle, prepare:內(nèi)部使用

poll:獲取新的io事件,當合適的時候,node會阻塞在這里

check: setImmediate()回調(diào)函數(shù)會在這里調(diào)用

close callbacks: e.g. socket.on("close", ...)

每次運行event loop,node檢查是否有對任何異步io或者timers的等待,沒有就關(guān)閉

Phases in Detail(各階段細述) timers

timers指定閾值(threshold)之后,會執(zhí)行回調(diào)函數(shù),但threshold不是執(zhí)行回調(diào)函數(shù)的確切時間(只是最短時間)。
timers回調(diào)函數(shù)一旦可以執(zhí)行了就會被執(zhí)行。然而操作系統(tǒng)的調(diào)度或者其他的回調(diào)函數(shù)可能推遲它的執(zhí)行。
由poll phase來控制什么時候timers被執(zhí)行

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

一開始timer被調(diào)度,里面的回調(diào)函數(shù)執(zhí)行l(wèi)og。
然后事件循環(huán)進入poll phase,此時隊列是空的(因為fs.readFile()沒有完成),所以就會等著,直到最早的timer的閾值(100)到時間,等了95 ms(還沒到,畢竟定的是100),fs.readFile() 這個時候完成了,所以它的回調(diào)函數(shù)就回被加poll的隊列并且被執(zhí)行(執(zhí)行10s),當回調(diào)函數(shù)完成了,隊列又空了,所以,event loop將會看到timer的閾值(100)已經(jīng)到了,
然后回到timers這個phase去執(zhí)行timers的回調(diào)函數(shù),也就是,打印出105秒

為了防止poll phase 獨占耗盡 event loop,libuv 也有一個最大值(基于系統(tǒng)),會在超過最大值之前停止輪詢更多的事件。

I/O callbacks

為系統(tǒng)操作(比如tcp錯誤類型)執(zhí)行回調(diào)函數(shù)
當tcp socket嘗試連接時接收到ECONNREFUSED,類unix系統(tǒng)將會想報道錯誤,要會在這個phase排隊執(zhí)行。

poll

poll phase有兩個功能

為到了時間的timers執(zhí)行腳本,然后

處理poll隊列的事件

當event loop 進入poll phase且沒有timers被調(diào)度,下面的事情會發(fā)生

poll不空,

通過回調(diào)函數(shù)隊列迭代的執(zhí)行

poll棧是空的

如果腳本已經(jīng)被setImmediate()調(diào)度,事件循環(huán)將會終止poll phase,到check phase去執(zhí)行那些被調(diào)度的腳本

等著回調(diào)函數(shù)被加進隊列,然后立馬執(zhí)行它
一旦poll空了,event loop將回檢查timers有沒有thresholds到了,有的話,wrap back to the timers phase,然后執(zhí)行timers的回調(diào)函數(shù)

check

特別的 timer

close callbacks setImmediate and setTimeout()

在poll完成以后執(zhí)行

在最小事件之后執(zhí)行

執(zhí)行順序:
依賴于調(diào)用的上下文

如果都在main module ,事件會被進程的性能限制(被其他應(yīng)用影響)

not within an I/O cycle:不確定的

within an I/O cycle:immediate總是先(更好)

// timeout_vs_immediate.js
setTimeout(function timeout () {
  console.log("timeout");
},0);

setImmediate(function immediate () {
  console.log("immediate");
});
// timeout_vs_immediate.js
var fs = require("fs")

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log("timeout")
  }, 0)
  setImmediate(() => {
    console.log("immediate")
  })
})

The Node.js Event Loop, Timers

參考:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81744.html

相關(guān)文章

  • Node.js】理解事件循環(huán)機制

    摘要:前沿是基于引擎的運行環(huán)境具有事件驅(qū)動非阻塞等特點結(jié)合具有網(wǎng)絡(luò)編程文件系統(tǒng)等服務(wù)端的功能用庫進行異步事件處理線程的單線程含義實際上說的是執(zhí)行同步代碼的主線程一個程序的啟動不止是分配了一個線程,而是我們只能在一個線程執(zhí)行代碼當出現(xiàn)資源調(diào)用連接等 前沿 Node.js 是基于V8引擎的javascript運行環(huán)境. Node.js具有事件驅(qū)動, 非阻塞I/O等特點. 結(jié)合Node API, ...

    Riddler 評論0 收藏0
  • JS與Node.js中事件循環(huán)

    摘要:的單線程,與它的用途有關(guān)。特點的顯著特點異步機制事件驅(qū)動。隊列的讀取輪詢線程,事件的消費者,的主角。它將不同的任務(wù)分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給引擎。 這兩天跟同事同事討論遇到的一個問題,js中的event loop,引出了chrome與node中運行具有setTimeout和Promise的程序時候執(zhí)行結(jié)果不一樣的問題,從而引出了Nodejs的...

    abson 評論0 收藏0
  • node核心特性理解

    摘要:概述本文主要介紹了我對的一些核心特性的理解,包括架構(gòu)特點機制核心模塊與簡單應(yīng)用。在此期間,主線程繼續(xù)執(zhí)行其他任務(wù)。延續(xù)了瀏覽器端單線程,只用一個主線程執(zhí)行,不斷循環(huán)遍歷事件隊列,執(zhí)行事件。 原文地址在我的博客,轉(zhuǎn)載請注明來源,謝謝! node是在前端領(lǐng)域經(jīng)常看到的詞。node對于前端的重要性已經(jīng)不言而喻,掌握node也是作為合格的前端工程師一項基本功了。知道node、知道后端的一些東西...

    huangjinnan 評論0 收藏0
  • 初窺JavaScript事件機制實現(xiàn)(一)—— Node.js事件驅(qū)動實現(xiàn)概覽

    摘要:如果當前沒有事件也沒有定時器事件,則返回。相關(guān)資料關(guān)于的架構(gòu)及設(shè)計思路的事件討論了使用線程池異步運行代碼。下一篇初窺事件機制的實現(xiàn)二中定時器的實現(xiàn) 在瀏覽器中,事件作為一個極為重要的機制,給予JavaScript響應(yīng)用戶操作與DOM變化的能力;在Node.js中,事件驅(qū)動模型則是其高并發(fā)能力的基礎(chǔ)。 學習JavaScript也需要了解它的運行平臺,為了更好的理解JavaScript的事...

    lavor 評論0 收藏0
  • 來,告訴你Node.js究竟是什么?

    摘要:當某個執(zhí)行完畢時,將以事件的形式通知執(zhí)行操作的線程,線程執(zhí)行這個事件的回調(diào)函數(shù)。為了處理異步,線程必須有事件循環(huán),不斷的檢查有沒有未處理的事件,依次予以處理。另外,單線程帶來的好處,操作系統(tǒng)完全不再有線程創(chuàng)建銷毀的時間開銷。 前言 如果你有一定的前端基礎(chǔ),比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能讓你以最低的成本快速過渡成為一個全棧工程師(我稱...

    Jonathan Shieber 評論0 收藏0
  • Node - 異步IO和事件循環(huán)

    摘要:它是在的基礎(chǔ)上改進的一種方案,通過對文件描述符上的事件狀態(tài)進行判斷。檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有情況下,除了關(guān)閉的回調(diào)函數(shù),它們由計時器和排定的之外,其余情況將在此處阻塞。執(zhí)行事件的,例如或者。 前言 學習Node就繞不開異步IO, 異步IO又與事件循環(huán)息息相關(guān), 而關(guān)于這一塊一直沒有仔細去了解整理過, 剛好最近在做項目的時候, 有了一些思考就記錄了下來, 希望能盡量將這一塊的...

    MyFaith 評論0 收藏0

發(fā)表評論

0條評論

Faremax

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<