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

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

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

1、簡介

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

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

2、阻塞

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

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

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

3、對比代碼

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

以文件系統(tǒng)模塊為例,這是一個同步文件讀取:

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

一個異步示例:

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

第一個例子看起來比第二個簡單,但缺點是第二行會阻止任何附加JavaScript的執(zhí)行,直到整個文件被讀取。請注意,在同步版本中,如果拋出錯誤,則需要捕獲錯誤,否則進程將崩潰。在異步版本中,由作者決定是否應該拋出錯誤。

我們稍微擴展一下我們的示例:

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

一個類似但不等價的異步示例:

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

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

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

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

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

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

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

在處理I/O時,應該避免一些方式。讓我們看一個例子:

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()之前運行,這將在實際讀取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)中放置了對fs.unlink()的非阻塞調(diào)用,這保證了操作的正確順序。

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

相關文章

  • 在 Node.js 中使用原生 ES 模塊方法解析

    在 Node.js 中使用原生 ES 模塊方法解析

    這篇文章主要介紹了在 Node.js 中使用原生 ES 模塊方法解析,還有部分內(nèi)容的鏈接,下面我們就來一起看看吧,需要的朋友可以參考下。
    2017-09-09
  • 安裝node.js和npm的一些常見報錯

    安裝node.js和npm的一些常見報錯

    NVM(Node?Version?Manager)是一個用于在同一機器上同時安裝并管理多個Node.js版本的工具,這篇文章主要給大家介紹了關于安裝node.js和npm的一些常見報錯,需要的朋友可以參考下
    2023-06-06
  • mac安裝nvm(node.js)多版本管理實踐步驟

    mac安裝nvm(node.js)多版本管理實踐步驟

    這篇文章主要介紹了mac安裝nvm(node.js)多版本管理的相關資料,NVM是一個用于管理多個Node.js版本的命令行工具,它允許開發(fā)者在同一臺機器上安裝、切換和卸載不同版本的Node.js,從而解決版本不兼容的問題,需要的朋友可以參考下
    2025-02-02
  • 詳談nodejs異步編程

    詳談nodejs異步編程

    本文詳細介紹了node.js異步編程的分類以及異步編程存在的問題,非常的詳盡,非常細致,這里推薦給小伙伴。
    2014-12-12
  • 使用iojs的jsdom庫實現(xiàn)同步系統(tǒng)時間

    使用iojs的jsdom庫實現(xiàn)同步系統(tǒng)時間

    本文給大家分享的是使用iojs的jsdom庫實現(xiàn)與http://open.baidu.com/special/time/ 同步系統(tǒng)時間。思路非常的清晰,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-04-04
  • 詳解一些適用于Node.js的命名約定

    詳解一些適用于Node.js的命名約定

    這篇文章主要介紹了詳解一些適用于Node.js的命名約定,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Node.js中child_process實現(xiàn)多進程

    Node.js中child_process實現(xiàn)多進程

    這篇文章主要介紹了Node.js中child_process實現(xiàn)多進程,需要的朋友可以參考下
    2015-02-02
  • nodejs高大上的部署方式(PM2)

    nodejs高大上的部署方式(PM2)

    這篇文章主要介紹了nodejs高大上的部署方式(PM2) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Node.js?實現(xiàn)簡單爬蟲的示例代碼

    Node.js?實現(xiàn)簡單爬蟲的示例代碼

    本文主要介紹了Node.js?實現(xiàn)簡單爬蟲,爬取美食網(wǎng)站的菜品標題和圖片鏈接,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Node.js異步I/O學習筆記

    Node.js異步I/O學習筆記

    這篇文章主要介紹了Node.js異步I/O學習筆記,本文詳細講解了異步I/O的基本概念、Node的異步I/O、非I/O的異步API、事件驅動與高性能服務器等內(nèi)容,需要的朋友可以參考下
    2014-11-11

最新評論

吉安市| 广河县| 临桂县| 潜山县| 股票| 荔浦县| 天水市| 邹城市| 鄂托克旗| 翁源县| 贞丰县| 黄平县| 子洲县| 沙河市| 凌源市| 西青区| 呼伦贝尔市| 谢通门县| 青浦区| 襄汾县| 绥德县| 沐川县| 南昌县| 安宁市| 灵山县| 洛阳市| 泗洪县| 台北县| 昌吉市| 永济市| 东安县| 合肥市| 隆化县| 台山市| 五大连池市| 枣庄市| 乌审旗| 崇左市| 临邑县| 平顺县| 陆丰市|