国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

node的事件機(jī)制

Faremax / 2910人閱讀

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

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

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

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

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

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

因?yàn)槿魏我粋€(gè)操作都可能調(diào)度更多的操作,而且poll phase中新的事件由內(nèi)核排隊(duì),所以正在輪詢的事件在被處理的時(shí)候,poll事件們可能會(huì)排隊(duì)。
結(jié)果:長(zhǎng)時(shí)間的運(yùn)行回調(diào)函數(shù)允許poll phase運(yùn)行事件比timer的閾值更長(zhǎng)。

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事件,當(dāng)合適的時(shí)候,node會(huì)阻塞在這里

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

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

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

Phases in Detail(各階段細(xì)述) timers

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

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

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

I/O callbacks

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

poll

poll phase有兩個(gè)功能

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

處理poll隊(duì)列的事件

當(dāng)event loop 進(jìn)入poll phase且沒(méi)有timers被調(diào)度,下面的事情會(huì)發(fā)生

poll不空,

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

poll棧是空的

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

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

check

特別的 timer

close callbacks setImmediate and setTimeout()

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

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

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

如果都在main module ,事件會(huì)被進(jìn)程的性能限制(被其他應(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/81744.html

相關(guān)文章

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

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

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

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

    abson 評(píng)論0 收藏0
  • node核心特性理解

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

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

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

    lavor 評(píng)論0 收藏0
  • 來(lái),告訴你Node.js究竟是什么?

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

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

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

    MyFaith 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<