欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js 阻塞與非阻塞的實(shí)現(xiàn)

 更新時(shí)間:2023年05月24日 09:28:29   作者:和你一起去月球  
本文主要介紹了Node.js中阻塞和非阻塞調(diào)用之間的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、簡(jiǎn)介

本概述介紹了Node.js中阻塞和非阻塞調(diào)用之間的區(qū)別。本概述將參考事件循環(huán)和libuv,但不需要事先了解這些主題。假設(shè)讀者對(duì)JavaScript語(yǔ)言和Node.js回調(diào)模式有基本的理解。

“I/O”主要指與libuv支持的系統(tǒng)磁盤和網(wǎng)絡(luò)的交互。

2、阻塞

阻塞是指Node.js進(jìn)程中額外JavaScript的執(zhí)行必須等待非JavaScript操作完成。發(fā)生這種情況是因?yàn)樵诎l(fā)生阻塞操作時(shí),事件循環(huán)無(wú)法繼續(xù)運(yùn)行JavaScript。

在Node.js中,由于CPU密集型,而不是等待非JavaScript操作(如I/O),而表現(xiàn)出較差性能的JavaScript通常不被稱為阻塞。Node.js標(biāo)準(zhǔn)庫(kù)中使用libuv的同步方法是最常用的阻塞操作。原生模塊也可能具有阻塞方法。

Node.js標(biāo)準(zhǔn)庫(kù)中的所有I/O方法都提供非阻塞的異步版本,并接受回調(diào)函數(shù)。有些方法也有阻塞的對(duì)應(yīng)方法,它們的名稱以Sync結(jié)尾。

3、對(duì)比代碼

阻塞方法同步執(zhí)行,非阻塞方法異步執(zhí)行。

以文件系統(tǒng)模塊為例,這是一個(gè)同步文件讀?。?/p>

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read

一個(gè)異步示例:

const fs = require('fs'); 
fs.readFile('/file.md', (err, data) => { 
      if (err) throw err; 
});

第一個(gè)例子看起來(lái)比第二個(gè)簡(jiǎn)單,但缺點(diǎn)是第二行會(huì)阻止任何附加JavaScript的執(zhí)行,直到整個(gè)文件被讀取。請(qǐng)注意,在同步版本中,如果拋出錯(cuò)誤,則需要捕獲錯(cuò)誤,否則進(jìn)程將崩潰。在異步版本中,由作者決定是否應(yīng)該拋出錯(cuò)誤。

我們稍微擴(kuò)展一下我們的示例:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
console.log(data);
moreWork(); // will run after console.log

一個(gè)類似但不等價(jià)的異步示例:

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
moreWork(); // will run before console.log

在上面的第一個(gè)例子中,console.log將在moreWork()之前調(diào)用。在第二個(gè)例子中,fs.readFile()是非阻塞的,因此JavaScript可以繼續(xù)執(zhí)行,并將首先調(diào)用moreWork()。在不等待文件讀取完成的情況下運(yùn)行moreWork()的能力是實(shí)現(xiàn)更高吞吐量的關(guān)鍵設(shè)計(jì)選擇。

4、并發(fā)性和吞吐量

Node.js中的JavaScript執(zhí)行是單線程的,因此并發(fā)是指事件循環(huán)在完成其他工作后執(zhí)行JavaScript回調(diào)函數(shù)的能力。任何期望以并發(fā)方式運(yùn)行的代碼都必須允許事件循環(huán)在非JavaScript操作(如I/O)發(fā)生時(shí)繼續(xù)運(yùn)行。

作為一個(gè)例子,讓我們考慮這樣一種情況,即對(duì)web服務(wù)器的每個(gè)請(qǐng)求需要50毫秒才能完成,其中45毫秒是可以異步完成的數(shù)據(jù)庫(kù)I/O。選擇非阻塞異步操作可以為每個(gè)請(qǐng)求釋放45ms的時(shí)間來(lái)處理其他請(qǐng)求。僅僅通過(guò)選擇使用非阻塞方法而不是阻塞方法,這在容量上是一個(gè)顯著的差異。

事件循環(huán)不同于許多其他語(yǔ)言中的模型,在這些語(yǔ)言中可以創(chuàng)建額外的線程來(lái)處理并發(fā)工作。

5、混合阻塞和非阻塞代碼

在處理I/O時(shí),應(yīng)該避免一些方式。讓我們看一個(gè)例子:

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
    console.log(data);
});
fs.unlinkSync('/file.md');

在上面的例子中,fs.unlinkSync()可能在fs.readFile()之前運(yùn)行,這將在實(shí)際讀取file.md之前刪除它。

更好的方法是,它完全不阻塞,并保證以正確的順序執(zhí)行:

const fs = require('fs');
fs.readFile('/file.md', (readFileErr, data) => {
  if (readFileErr) throw readFileErr;
  console.log(data);
  fs.unlink('/file.md', unlinkErr => {
      if (unlinkErr) throw unlinkErr;
  });
});

上面在fs.readFile()的回調(diào)中放置了對(duì)fs.unlink()的非阻塞調(diào)用,這保證了操作的正確順序。

到此這篇關(guān)于Node.js 阻塞與非阻塞的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Node 阻塞與非阻塞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解用node.js實(shí)現(xiàn)簡(jiǎn)單的反向代理

    詳解用node.js實(shí)現(xiàn)簡(jiǎn)單的反向代理

    本篇文章主要介紹了詳解用node.js實(shí)現(xiàn)簡(jiǎn)單的反向代理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 深入理解Node.js回調(diào)函數(shù)

    深入理解Node.js回調(diào)函數(shù)

    這篇文章主要介紹了Node.js回調(diào)函數(shù),為了解決回調(diào)函數(shù)的缺點(diǎn),出現(xiàn)了一些替代方案,如Promise、async/await等,這些方案提供了更簡(jiǎn)潔、可讀性更高的代碼結(jié)構(gòu),使異步編程更加容易和可維護(hù),需要的朋友可以參考下
    2023-11-11
  • 利用Mongoose讓JSON數(shù)據(jù)直接插入或更新到MongoDB

    利用Mongoose讓JSON數(shù)據(jù)直接插入或更新到MongoDB

    這篇文章主要給大家介紹了利用Mongoose讓JSON數(shù)據(jù)直接插入或更新到MongoDB數(shù)據(jù)庫(kù)的相關(guān)資料,文中詳細(xì)介紹了配置Mongoose、創(chuàng)建目錄及文件、插入數(shù)據(jù),POST提交JSON增加一條記錄以及詢數(shù)據(jù),取出剛增加的記錄等內(nèi)容,需要的朋友可以參考下。
    2017-05-05
  • Node.js中的EventEmitter類使用小結(jié)

    Node.js中的EventEmitter類使用小結(jié)

    EventEmitter 是 Node.js 中的一個(gè)核心模塊,它提供了一種實(shí)現(xiàn)事件驅(qū)動(dòng)編程的機(jī)制,它是一個(gè)基于觀察者模式的類,用于在應(yīng)用程序中處理事件和觸發(fā)事件,這篇文章主要介紹了Node.js中的EventEmitter類介紹,需要的朋友可以參考下
    2023-12-12
  • 用Node.js遍歷多級(jí)目錄處理文件的代碼詳解

    用Node.js遍歷多級(jí)目錄處理文件的代碼詳解

    在日常開發(fā)中,處理大量的文件操作是一個(gè)常見的需求,特別是在圖像處理和存檔管理領(lǐng)域,本文給大家介紹了如何用Node.js遍歷多級(jí)目錄處理文件,文章給出了主要步驟和完整代碼,需要的朋友可以參考下
    2024-06-06
  • node.js適合游戲后臺(tái)開發(fā)嗎?

    node.js適合游戲后臺(tái)開發(fā)嗎?

    這篇文章主要介紹了node.js適合游戲后臺(tái)開發(fā)嗎?node.js是不是能代替C++開發(fā)游戲后臺(tái)呢?看完本文我想你會(huì)有一定的了解了,需要的朋友可以參考下
    2014-09-09
  • require加載器實(shí)現(xiàn)原理的深入理解

    require加載器實(shí)現(xiàn)原理的深入理解

    這篇文章主要給大家介紹了關(guān)于require加載器實(shí)現(xiàn)原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Node.js Streams文件讀寫操作詳解

    Node.js Streams文件讀寫操作詳解

    如果你在處理應(yīng)用中 I/O 相關(guān)的操作,你可以利用 Node.js 中的流(stream),這篇文章主要為大家詳細(xì)介紹了Node.js Streams文件讀寫操作,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 輕松創(chuàng)建nodejs服務(wù)器(4):路由

    輕松創(chuàng)建nodejs服務(wù)器(4):路由

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(4):路由,服務(wù)器需要根據(jù)不同的URL或請(qǐng)求來(lái)執(zhí)行不一樣的操作,我們可以通過(guò)路由來(lái)實(shí)現(xiàn)這個(gè)步驟,需要的朋友可以參考下
    2014-12-12
  • 淺析node.js中close事件

    淺析node.js中close事件

    本文簡(jiǎn)單介紹了http.ServerRespose對(duì)象的close事件,并給出了相關(guān)實(shí)例,推薦給需要的小伙伴參考下吧。
    2014-11-11

最新評(píng)論