最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node高并發(fā)原理機(jī)制解讀

 更新時(shí)間:2023年10月30日 09:54:05   作者:蠻吉(lambda)  
這篇文章主要介紹了node高并發(fā)原理機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

概念

  • 1.事件循環(huán):

事件循環(huán)是一種編程構(gòu)造,用于等待和分派程序中的事件或消息, 主線程從"任務(wù)隊(duì)列"中讀取事件,這個(gè)過(guò)程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱為Event Loop(事件循環(huán))

  • 2.事件隊(duì)列:

當(dāng)用戶的網(wǎng)絡(luò)請(qǐng)求或者其它的異步操作到來(lái)時(shí),node都會(huì)把它放到Event Queue之中,此時(shí)并不會(huì)立即執(zhí)行它,代碼也不會(huì)被阻塞,繼續(xù)往下走,直到主線程代碼執(zhí)行完畢。

  • 3.任務(wù)隊(duì)列:

任務(wù)隊(duì)列"是一個(gè)事件的隊(duì)列(也可以理解成消息的隊(duì)列),IO設(shè)備完成一項(xiàng)任務(wù),就在"任務(wù)隊(duì)列"中添加一個(gè)事件,表示相關(guān)的異步任務(wù)可以進(jìn)入"執(zhí)行棧"了。主線程讀取"任務(wù)隊(duì)列",就是讀取里面有哪些事件。

  • 4.事件驅(qū)動(dòng):

實(shí)質(zhì)是通過(guò)主循環(huán)加事件觸發(fā)方式運(yùn)行程序

  • 5.node

Node.js 不是一門語(yǔ)言也不是框架,它只是基于 Google V8 引擎的 JavaScript 運(yùn)行時(shí)環(huán)境,是對(duì) js 功能的拓展。提供了網(wǎng)絡(luò)、文件、dns 解析、進(jìn)程線程等功能。

  • 6.libuv

libuv是專門為Node.js開(kāi)發(fā)的一個(gè)封裝庫(kù),提供跨平臺(tái)的異步I/O能力。

注:

1. 一個(gè)事件循環(huán)有一個(gè)或多個(gè)任務(wù)隊(duì)列。一個(gè)任務(wù)隊(duì)列是一組的任務(wù)

2. Libuv 主要是,利用系統(tǒng)提供的事件驅(qū)動(dòng)模塊解決網(wǎng)絡(luò)異步 IO,利用線程池解決文件IO。另外還實(shí)現(xiàn)了定時(shí)器,對(duì)進(jìn)程、線程等使用進(jìn)行了封裝。

node架構(gòu)圖

Node Standard Library 標(biāo)準(zhǔn)庫(kù),如Http, event模塊。

Node Bindings 是溝通JS 和 C++的橋梁,封裝V8和Libuv的細(xì)節(jié),向上層提供基礎(chǔ)API服務(wù)。由 C/C++ 實(shí)現(xiàn)。

V8 是Google開(kāi)發(fā)的JavaScript引擎,提供JavaScript運(yùn)行環(huán)境,可以說(shuō)它就是 Node.js 的發(fā)動(dòng)機(jī)。

Libuv 是專門為Node.js開(kāi)發(fā)的一個(gè)封裝庫(kù),提供跨平臺(tái)的異步I/O能力.

單線程、異步

單線程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會(huì)執(zhí)行后一個(gè)任務(wù)。

如果前一個(gè)任務(wù)耗時(shí)很長(zhǎng),后一個(gè)任務(wù)就不得不一直等著。

node單線程指的是node在執(zhí)行程序代碼時(shí),主線程是單線程。

異步體現(xiàn)在,主線程之外,還維護(hù)了一個(gè)"事件隊(duì)列"(Event queue)。

當(dāng)用戶的網(wǎng)絡(luò)請(qǐng)求或者其它的異步操作到來(lái)時(shí),node都會(huì)把它放到Event Queue之中,此時(shí)并不會(huì)立即執(zhí)行它,代碼也不會(huì)被阻塞,繼續(xù)往下走,直到主線程代碼執(zhí)行完畢.

注:

  • JavaScript 是單線程的,Node 本身其實(shí)是多線程的,只是 I/O 線程使用的 CPU 比較少;還有個(gè)重要的觀點(diǎn)是,除了用戶的代碼無(wú)法并行執(zhí)行外,所有的 I/O (磁盤 I/O 和網(wǎng)絡(luò) I/O) 則是可以并行起來(lái)的。
  • libuv 線程池默認(rèn)打開(kāi) 4 個(gè),最多打開(kāi) 128個(gè) 線程。

事件循環(huán)

Node 開(kāi)始執(zhí)行腳本時(shí),會(huì)先進(jìn)行事件循環(huán)的初始化,但是這時(shí)事件循環(huán)還沒(méi)有開(kāi)始,會(huì)先完成下面的事情。

  • 同步任務(wù)
  • 發(fā)出異步請(qǐng)求
  • 規(guī)劃定時(shí)器生效的時(shí)間
  • 執(zhí)行process.nextTick()等

然后就調(diào)用libuv事件循環(huán)階段,事件循環(huán)會(huì)無(wú)限次地執(zhí)行,一輪又一輪。

只有異步任務(wù)的回調(diào)函數(shù)隊(duì)列清空了,才會(huì)停止執(zhí)行。

Node中的事件循環(huán)有6個(gè)階段

event loop 的每個(gè)階段都有一個(gè)任務(wù)隊(duì)列

當(dāng) event loop 到達(dá)某個(gè)階段時(shí),將執(zhí)行該階段的任務(wù)隊(duì)列,直到隊(duì)列清空或執(zhí)行的回調(diào)達(dá)到系統(tǒng)上限后,才會(huì)轉(zhuǎn)入下一個(gè)階段

當(dāng)所有階段被順序執(zhí)行一次后,稱 event loop 完成了一個(gè) tick

注:

node中的事件循環(huán)與瀏覽器有區(qū)別~

事件驅(qū)動(dòng)+事件循環(huán)實(shí)現(xiàn)高并發(fā)

具體執(zhí)行順序:

1、每個(gè)Node.js進(jìn)程只有一個(gè)主線程在執(zhí)行程序代碼,形成一個(gè)執(zhí)行棧(execution context stack)

2、主線程之外,還維護(hù)了一個(gè)"事件隊(duì)列"(Event queue)。當(dāng)用戶的網(wǎng)絡(luò)請(qǐng)求或者其它的異步操作到來(lái)時(shí),node都會(huì)把它放到Event Queue之中,此時(shí)并不會(huì)立即執(zhí)行它,代碼也不會(huì)被阻塞,繼續(xù)往下走,直到主線程代碼執(zhí)行完畢。

3、主線程代碼執(zhí)行完畢完成后,然后通過(guò)Event Loop,也就是事件循環(huán)機(jī)制,開(kāi)始到Event Queue的開(kāi)頭取出第一個(gè)事件,從線程池中分配一個(gè)線程去執(zhí)行這個(gè)事件,接下來(lái)繼續(xù)取出第二個(gè)事件,再?gòu)木€程池中分配一個(gè)線程去執(zhí)行,然后第三個(gè),第四個(gè)。主線程不斷的檢查事件隊(duì)列中是否有未執(zhí)行的事件,直到事件隊(duì)列中所有事件都執(zhí)行完了,此后每當(dāng)有新的事件加入到事件隊(duì)列中,都會(huì)通知主線程按順序取出交EventLoop處理。當(dāng)有事件執(zhí)行完畢后,會(huì)通知主線程,主線程執(zhí)行回調(diào),線程歸還給線程池。

總線程不斷重復(fù)第三步

注意:

我們所看到的node.js單線程只是一個(gè)js主線程與ui渲染共享一個(gè)線程,本質(zhì)上的異步操作還是由線程池完成的,node將所有的阻塞操作都交給了內(nèi)部的線程池去實(shí)現(xiàn),本身只負(fù)責(zé)不斷的往返調(diào)度,并沒(méi)有進(jìn)行真正的I/O操作,從而實(shí)現(xiàn)異步非阻塞I/O,這便是node單線程和事件驅(qū)動(dòng)的精髓之處了

總結(jié)

libuv 線程池默認(rèn)打開(kāi) 4 個(gè),最多打開(kāi) 128個(gè) 線程。(例如:以前 web 服務(wù)器同一時(shí)間比如說(shuō)最多只能接收 100 個(gè)請(qǐng)求,多的就無(wú)法接收了。nodejs 所謂的高并發(fā)是指可以同時(shí)接收 1000、10000 個(gè)請(qǐng)求,只不過(guò)以排隊(duì)的方式在等待。)

主線程執(zhí)行js,是單線程的,js代碼在做大量計(jì)算就是cpu密集了。主線程不空閑出來(lái)也沒(méi)法處理 io 的事,所以就會(huì)阻塞了。

回調(diào)只能保證某個(gè)請(qǐng)求按照順序執(zhí)行,不能保證多個(gè)請(qǐng)求訪問(wèn)一個(gè)資源的先后順序,多個(gè)請(qǐng)求訪問(wèn)一個(gè)資源是要加鎖的,用事務(wù)加鎖就行。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用node.js實(shí)現(xiàn)接口步驟詳細(xì)記錄

    使用node.js實(shí)現(xiàn)接口步驟詳細(xì)記錄

    這篇文章主要給大家介紹了關(guān)于使用node.js實(shí)現(xiàn)接口步驟的相關(guān)資料,對(duì)于剛開(kāi)始不會(huì)node寫接口和調(diào)用接口,可以通過(guò)這個(gè)清晰的初步了解到整個(gè)過(guò)程,下面需要的朋友可以參考下
    2023-03-03
  • Elasticsearch插件及nodejs的安裝配置

    Elasticsearch插件及nodejs的安裝配置

    這篇文章主要為大家介紹了Elasticsearch插件及nodejs的安裝配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 在Mac OS下使用Node.js的簡(jiǎn)單教程

    在Mac OS下使用Node.js的簡(jiǎn)單教程

    這篇文章主要介紹了在Mac OS下使用Node.js的簡(jiǎn)單教程,Node.js是讓JavaScript應(yīng)用運(yùn)行于服務(wù)器端的框架,需要的朋友可以參考下
    2015-06-06
  • Node.js的包詳細(xì)介紹

    Node.js的包詳細(xì)介紹

    這篇文章主要介紹了Node.js的包詳細(xì)介紹,Node.js的包是一個(gè)目錄,其中包含JSON格式的包說(shuō)明文件package.json,Node.js的包基本遵循CommonJS規(guī)范,需要的朋友可以參考下
    2015-01-01
  • Windows系統(tǒng)中使用fnm自動(dòng)管理node版本的方法

    Windows系統(tǒng)中使用fnm自動(dòng)管理node版本的方法

    在Node.js開(kāi)發(fā)中,包管理工具扮演著至關(guān)重要的角色,下面這篇文章主要介紹了Windows系統(tǒng)中使用fnm自動(dòng)管理node版本的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • 垃圾回收器的相關(guān)知識(shí)點(diǎn)總結(jié)

    垃圾回收器的相關(guān)知識(shí)點(diǎn)總結(jié)

    本文是小編在網(wǎng)絡(luò)上整理的關(guān)于垃圾回收器的相關(guān)知識(shí)點(diǎn),很多語(yǔ)言和程序都用的到,有興趣的可以學(xué)習(xí)下。
    2018-05-05
  • Node.js中常用文件系統(tǒng)操作的示例詳解

    Node.js中常用文件系統(tǒng)操作的示例詳解

    這篇文章將深入探討?Node.js?中的文件系統(tǒng)(fs)模塊,它是?Node.js?中進(jìn)行文件讀寫的核心模塊,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 基于node.js制作簡(jiǎn)單爬蟲教程

    基于node.js制作簡(jiǎn)單爬蟲教程

    這篇文章主要為大家詳細(xì)介紹了基于node.js制作簡(jiǎn)單爬蟲的教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Node.js讀取和寫入文件的代碼示例

    Node.js讀取和寫入文件的代碼示例

    在現(xiàn)代前端開(kāi)發(fā)中,Node.js已經(jīng)成為不可或缺的一部分,其高效的非阻塞I/O模型使得它非常適合處理文件操作,在這篇博客中,我們將探討如何使用Node.js讀取和寫入文件,我們會(huì)涉及基本的文件系統(tǒng)模塊,并提供可運(yùn)行的代碼示例,以便您可以輕松上手
    2024-11-11
  • Node.js(安裝,啟動(dòng),測(cè)試)

    Node.js(安裝,啟動(dòng),測(cè)試)

    這里主要介紹基于windows平臺(tái)上最簡(jiǎn)單方便的安裝方式,啟動(dòng)以及簡(jiǎn)單測(cè)試
    2014-06-06

最新評(píng)論

富川| 汶上县| 平泉县| 武清区| 葫芦岛市| 临泉县| 资阳市| 淄博市| 高台县| 石首市| 黎川县| 涞水县| 永平县| 罗甸县| 柳林县| 甘孜县| 西盟| 雷山县| 湖南省| 鞍山市| 银川市| 易门县| 阿拉尔市| 霍州市| 崇礼县| 日土县| 云龙县| 防城港市| 湘潭县| 岳阳县| 临汾市| 芦溪县| 双辽市| 田东县| 京山县| 清徐县| 务川| 江源县| 保德县| 襄樊市| 汪清县|