摘要:基本上所有都事件機(jī)制都是通過觀察者模式實現(xiàn)單線程類似進(jìn)入一個事件循環(huán),直到?jīng)]有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù)。
Node.js事件循環(huán)
Node.js 是單進(jìn)程單線程應(yīng)用程序,但是因為V8引擎提供的異步執(zhí)行回調(diào)接口,通過這些接口可以處理大量的并發(fā),所以性能非常高。
Node.js 幾乎每一個API都支持回調(diào)函數(shù)。
Node.js 基本上所有都事件機(jī)制都是通過觀察者模式實現(xiàn)
Node.js 單線程類似進(jìn)入一個while(true)事件循環(huán),直到?jīng)]有事件觀察者退出,每個異步事件都生成一個事件觀察者,
如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù)。
事件驅(qū)動程序
Node.js 使用事件驅(qū)動模型,當(dāng)web server接收到請求,就把它關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個web請求。
當(dāng)這個請求完成,它被放回處理隊列,當(dāng)?shù)竭_(dá)隊列開頭,這個結(jié)果被返回給用戶。
這個模型非常高效可擴(kuò)展性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅(qū)動IO)
在事件驅(qū)動模型中,會生成一個主循環(huán)來監(jiān)聽事件,當(dāng)檢測到事件時觸發(fā)回調(diào)函數(shù)。
//引入events const events = require("events") // 創(chuàng)建eventEmitter對象 const eventEmitter = new events.EventEmitter(); // 創(chuàng)建時間處理程序 var connectHandler = function connected (){ console.log("連接成功") // 出發(fā)data_received事件 eventEmitter.emit("data_received") } // 綁定connection事件處理程序 eventEmitter.on("connection", connectHandler) // 使用匿名函數(shù)綁定data_received事件 eventEmitter.on("data_received",() => { console.log("數(shù)據(jù)接收成功。") }) // 觸發(fā)connection事件 eventEmitter.emit("connection") console.log("程序執(zhí)行完畢")
Node應(yīng)用程序是如何工作的 ??
在Node應(yīng)用程序中,執(zhí)行異步操作都函數(shù)將回調(diào)函數(shù)作為最后一個參數(shù),回調(diào)函數(shù)接收錯誤對象做一個第一個參數(shù)。
const fs = require("fs") fs.readFile("input.txt",(err,data) => { if(err) { console.log(err) }else{ console.log(data.toString()) } }) console.log("程序執(zhí)行結(jié)束!")
這段代碼,input.txt文件我給刪除了,所以在執(zhí)行過程中,發(fā)生錯誤,錯誤err對象就會輸出錯誤信息。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/104383.html
摘要:事件處理器,則是當(dāng)指定事件觸發(fā)時,執(zhí)行的一段代碼。事件循環(huán)以一個無限循環(huán)的形式啟動,存在于二進(jìn)制文件里函數(shù)的最后,當(dāng)沒有更多可被執(zhí)行的事件處理器時,它就退出。 前言 如果你了解過Node.js,那么你一定聽說過事件循環(huán)。你一定想知道它為什么那么特殊,并且為什么你需要關(guān)注它?此時此刻的你,可能已經(jīng)寫過許多基于Express.js的后端代碼,但沒有接觸到任何的循環(huán)。 在下文中,我們會先在一...
摘要:輪詢投票處理下一次處理的新事件立即設(shè)置運行通過注冊的所有回調(diào)關(guān)閉執(zhí)行所有的回調(diào)工作處理延遲此度量標(biāo)準(zhǔn)測量線程池處理異步任務(wù)需要多長時間。高工作時間處理延遲表明繁忙耗盡的線程池。 原文=> What you should know to really understand the Node.js Event Loop Node.js 是一個基于事件的平臺。這就意味著在Node中發(fā)生的所...
摘要:檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有,除了由定時器調(diào)度的一些和將在適當(dāng)?shù)臅r候在這里阻塞。在事件循環(huán)的每次運行之間,檢查它是否在等待任何異步或定時器,如果沒有,則徹底關(guān)閉。 Node.js事件循環(huán)、定時器和process.nextTick() 什么是事件循環(huán)? 事件循環(huán)允許Node.js執(zhí)行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統(tǒng)內(nèi)核。 ...
摘要:前沿是基于引擎的運行環(huán)境具有事件驅(qū)動非阻塞等特點結(jié)合具有網(wǎng)絡(luò)編程文件系統(tǒng)等服務(wù)端的功能用庫進(jìn)行異步事件處理線程的單線程含義實際上說的是執(zhí)行同步代碼的主線程一個程序的啟動不止是分配了一個線程,而是我們只能在一個線程執(zhí)行代碼當(dāng)出現(xiàn)資源調(diào)用連接等 前沿 Node.js 是基于V8引擎的javascript運行環(huán)境. Node.js具有事件驅(qū)動, 非阻塞I/O等特點. 結(jié)合Node API, ...
js異步歷史 一個 JavaScript 引擎會常駐于內(nèi)存中,它等待著我們把JavaScript 代碼或者函數(shù)傳遞給它執(zhí)行 在 ES3 和更早的版本中,JavaScript 本身還沒有異步執(zhí)行代碼的能力,引擎就把代碼直接順次執(zhí)行了,異步任務(wù)都是宿主環(huán)境(瀏覽器)發(fā)起的(setTimeout、AJAX等)。 在 ES5 之后,JavaScript 引入了 Promise,這樣,不需要瀏覽器的安排,J...
摘要:的單線程,與它的用途有關(guān)。特點的顯著特點異步機(jī)制事件驅(qū)動。隊列的讀取輪詢線程,事件的消費者,的主角。它將不同的任務(wù)分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給引擎。 這兩天跟同事同事討論遇到的一個問題,js中的event loop,引出了chrome與node中運行具有setTimeout和Promise的程序時候執(zhí)行結(jié)果不一樣的問題,從而引出了Nodejs的...
閱讀 3411·2021-11-25 09:43
閱讀 3085·2021-10-15 09:43
閱讀 2038·2021-09-08 09:36
閱讀 3031·2019-08-30 15:56
閱讀 816·2019-08-30 15:54
閱讀 2755·2019-08-30 15:54
閱讀 3069·2019-08-30 11:26
閱讀 1317·2019-08-29 17:27