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

資訊專欄INFORMATION COLUMN

理解Node.js的事件輪詢

testHs / 3233人閱讀

摘要:實(shí)際上官方給出的單線程是具有誤導(dǎo)性的。如果開發(fā)者在回調(diào)函數(shù)中調(diào)用了阻塞方法比如上文中的函數(shù),那么整個(gè)事件輪詢就會(huì)阻塞,事件隊(duì)列中的事件得不到及時(shí)處理。后記參考文章事件輪詢詳述

前言

總括

原文地址:理解Node.js的事件輪詢

Node小應(yīng)用:Node-sample

智者閱讀群書,亦閱歷人生

正文 Node.js的兩個(gè)基本概念

Node.js的第一個(gè)基本概念就是I/O操作開銷是巨大的:

所以,當(dāng)前變成技術(shù)中最大的浪費(fèi)來自于等待I/O操作的完成。有幾種方法可以解決性能的影響:

同步方式:按次序一個(gè)一個(gè)的處理請求。:簡單;:任何一個(gè)請求都可以阻塞其他所有請求。

開啟新進(jìn)程:每個(gè)請求都開啟一個(gè)新進(jìn)程。:簡單;:大量的鏈接意味著大量的進(jìn)程。

開啟新線程:每個(gè)請求都開啟一個(gè)新線程。:簡單,而且跟進(jìn)程比,對系統(tǒng)內(nèi)核更加友好,因?yàn)榫€程比進(jìn)程輕的多;:不是所有的機(jī)器都支持線程,而且對于要處理共享資源的情況,多線程編程會(huì)很快變得太過于復(fù)雜。

第二個(gè)基本概念是每個(gè)連接都創(chuàng)建一個(gè)新線程是很消耗內(nèi)存的(例如:你可以對比Nginx回想一下Apache內(nèi)存耗盡的情景)。

Apache是多線程的:它為每個(gè)請求開啟一個(gè)新的線程(或者是進(jìn)程,這取決于你的配置),當(dāng)并發(fā)連接增多時(shí),你可以看看它是怎么一點(diǎn)一點(diǎn)耗盡內(nèi)存的。Nginx和Node.js不是多線程的,因?yàn)榫€程的消耗太“重”了。它們兩個(gè)是單線程、基于事件的,這就把處理眾多連接所產(chǎn)生的線程/進(jìn)程消耗給消除了。

單線程

確實(shí)只有一個(gè)線程:你不能并行執(zhí)行任何代碼,比如:下面的“sleep”將會(huì)阻塞sever1秒鐘:

function sleep() {
   var now = new Data().getTime();
   while (new Date().getTime() < now + 1000) {
         // do nothing
   }
}
sleep();

但就我目前學(xué)習(xí)階段而言,我覺得好多人對于所謂的node單線程是有誤解的。實(shí)際上官方給出的“單線程”是具有誤導(dǎo)性的。所謂的單線程是指你的代碼只運(yùn)行在一個(gè)線程上(好多地方都叫它主線程,實(shí)際上Javascript的瀏覽器運(yùn)行環(huán)境不也是這么處理我們寫的Javascript代碼的嘛),而諸多任務(wù)的并行處理,就需要多線程了,如下圖:

如上圖,Node.js中的單線程之說指的就是這個(gè)主線程,這個(gè)主線程有一個(gè)循環(huán)結(jié)構(gòu),保持著整個(gè)程序(你寫的代碼)的運(yùn)轉(zhuǎn)。

事件輪詢

其實(shí)上面我們所說的維持主線程運(yùn)行的循環(huán)這部分就是"事件輪詢",它存在于主線程中,負(fù)責(zé)不停地調(diào)用開發(fā)者編寫的代碼。但對開發(fā)者是不可見的。so...開發(fā)者編寫的代碼是怎樣被調(diào)用的呢?看下圖:

如上圖,異步函數(shù)在執(zhí)行結(jié)束后,會(huì)在事件隊(duì)列中添加一個(gè)事件(遵循先進(jìn)先出原則),主線程中的代碼執(zhí)行完畢后(即一次循環(huán)結(jié)束),下一次循環(huán)開始就在事件隊(duì)列中"讀取"事件,然后調(diào)用它所對應(yīng)的回調(diào)函數(shù)(所以回調(diào)函數(shù)的執(zhí)行順序是不一定的)。如果開發(fā)者在回調(diào)函數(shù)中調(diào)用了阻塞方法(比如上文中的sleep函數(shù)),那么整個(gè)事件輪詢就會(huì)阻塞,事件隊(duì)列中的事件得不到及時(shí)處理。正因?yàn)檫@樣,nodejs中的一些庫方法均是異步的,也提倡用戶調(diào)用異步方法。

var fs = require("fs");
fs.readFile("hello.txt", function (err, data) {  //異步讀取文件
  console.log("read file end");
});
while(1)
{
    console.log("call readFile over");
}

如上代碼,我們雖然使用了異步方法readfile讀取文件,但read file end永遠(yuǎn)不會(huì)輸出,因?yàn)榇a始終在while循環(huán)中,下一次事件輪詢始終沒法開始,也就沒法"讀取"事件隊(duì)列調(diào)用相應(yīng)的回調(diào)函數(shù)了。

最后有一個(gè)Node-sample是博主平時(shí)積累的一些代碼,包含注釋,匯總成了一個(gè)小應(yīng)用,還是可以看到學(xué)習(xí)的蛛絲馬跡的。感興趣的您可以看看。

后記

參考文章:

Understanding the node.js event loop

nodejs事件輪詢詳述

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86777.html

相關(guān)文章

  • Node.js 事件循環(huán)工作流程 & 生命周期

    摘要:定時(shí)器階段這個(gè)是事件循環(huán)開始的階段,綁定到這個(gè)階段的隊(duì)列,保留著定時(shí)器的回調(diào),盡管它并沒有將回調(diào)推入隊(duì)列中,但是以最小的堆來維持計(jì)時(shí)器并且在到達(dá)規(guī)定的事件后執(zhí)行回調(diào)。 本文,將會(huì)詳細(xì)的講解 node.js 事件循環(huán)工作流程和生命周期 一些常見的誤解 在 js 引擎內(nèi)部的事件循環(huán) 最常見的誤解之一,事件循環(huán)是 Javascript 引擎(V8,spiderMonkey等)的一部分。事實(shí)上...

    ConardLi 評論0 收藏0
  • Node.js 指南(Node.js事件循環(huán)、定時(shí)器和process.nextTick())

    摘要:檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有,除了由定時(shí)器調(diào)度的一些和將在適當(dāng)?shù)臅r(shí)候在這里阻塞。在事件循環(huán)的每次運(yùn)行之間,檢查它是否在等待任何異步或定時(shí)器,如果沒有,則徹底關(guān)閉。 Node.js事件循環(huán)、定時(shí)器和process.nextTick() 什么是事件循環(huán)? 事件循環(huán)允許Node.js執(zhí)行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統(tǒng)內(nèi)核。 ...

    pingink 評論0 收藏0
  • Node.js事件循環(huán)(Event Loop),計(jì)時(shí)器(Timers)以及process.nex

    摘要:回調(diào)函數(shù)執(zhí)行幾乎所有的回調(diào)函數(shù),除了關(guān)閉回調(diào)函數(shù),定時(shí)器計(jì)劃的回調(diào)函數(shù)和。輪詢此階段有兩個(gè)主要的功能執(zhí)行已過時(shí)的定時(shí)器腳本處理輪詢隊(duì)列中的事件。一旦輪詢隊(duì)列為空,事件循環(huán)將檢查已達(dá)到時(shí)間閾值的定時(shí)器。 什么是事件循環(huán)(Event Loop)? 事件環(huán)使得Node.js可以執(zhí)行非阻塞I/O 操作,只要有可能就將操作卸載到系統(tǒng)內(nèi)核,盡管JavaScript是單線程的。 由于大多數(shù)現(xiàn)代(終端...

    KoreyLee 評論0 收藏0
  • JSNode.js事件循環(huán)

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

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

    摘要:如果當(dāng)前沒有事件也沒有定時(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)行平臺,為了更好的理解JavaScript的事...

    lavor 評論0 收藏0

發(fā)表評論

0條評論

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