亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

node的事件機制

Faremax / 2962人閱讀

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

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

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

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

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

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

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

phase overview 階段概況

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

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

idle, prepare:內部使用

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

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

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

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

Phases in Detail(各階段細述) timers

timers指定閾值(threshold)之后,會執(zhí)行回調函數(shù),但threshold不是執(zhí)行回調函數(shù)的確切時間(只是最短時間)。
timers回調函數(shù)一旦可以執(zhí)行了就會被執(zhí)行。然而操作系統(tǒng)的調度或者其他的回調函數(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被調度,里面的回調函數(shù)執(zhí)行l(wèi)og。
然后事件循環(huán)進入poll phase,此時隊列是空的(因為fs.readFile()沒有完成),所以就會等著,直到最早的timer的閾值(100)到時間,等了95 ms(還沒到,畢竟定的是100),fs.readFile() 這個時候完成了,所以它的回調函數(shù)就回被加poll的隊列并且被執(zhí)行(執(zhí)行10s),當回調函數(shù)完成了,隊列又空了,所以,event loop將會看到timer的閾值(100)已經(jīng)到了,
然后回到timers這個phase去執(zhí)行timers的回調函數(shù),也就是,打印出105秒

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

I/O callbacks

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

poll

poll phase有兩個功能

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

處理poll隊列的事件

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

poll不空,

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

poll棧是空的

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

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

check

特別的 timer

close callbacks setImmediate and setTimeout()

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

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

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

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

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

參考:

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

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/81744.html

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

    MyFaith 評論0 收藏0

發(fā)表評論

0條評論

Faremax

|高級講師

TA的文章

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