成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js 指南(阻塞與非阻塞概述)

zebrayoung / 1059人閱讀

摘要:標(biāo)準(zhǔn)庫中的所有方法都提供非阻塞的異步版本,并接受回調(diào)函數(shù),某些方法還具有對應(yīng)的阻塞方法,其名稱以結(jié)尾。比較代碼阻塞方法同步執(zhí)行,非阻塞方法異步執(zhí)行。

阻塞與非阻塞概述

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

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

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

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

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

比較代碼

阻塞方法同步執(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;
});

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

讓我們稍微擴展一下我們的例子:

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

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

并發(fā)和吞吐量

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

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

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

混合阻塞和非阻塞代碼的危險

處理I/O時應(yīng)該避免一些模式,我們來看一個例子:

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)用,這保證了正確的操作順序。

其他資源

libuv

關(guān)于Node.js

上一篇:遷移到安全的Buffer構(gòu)造函數(shù) 下一篇:Node.js事件循環(huán)、定時器和process.nextTick()

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108575.html

相關(guān)文章

  • Node.js 指南(目錄)

    Node.js 指南 Node.js?是基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運行時。 常規(guī) 關(guān)于Node.js 入門指南 輕松分析Node.js應(yīng)用程序 Docker化Node.js Web應(yīng)用程序 遷移到安全的Buffer構(gòu)造函數(shù) Node.js核心概念 阻塞與非阻塞概述 Node.js事件循環(huán)、定時器和process.nextTick() 不要阻塞事...

    未東興 評論0 收藏0
  • Node.js 指南(關(guān)于Node.js

    摘要:如果不熟悉這種語言,有一篇關(guān)于阻塞與非阻塞的完整文章。在設(shè)計上與的或的等系統(tǒng)類似,并受其影響,進一步采用事件模型。它將事件循環(huán)呈現(xiàn)為運行時構(gòu)造而不是庫,在其他系統(tǒng)中,始終存在阻塞調(diào)用以啟動事件循環(huán)。上一篇指南目錄下一篇入門指南 關(guān)于Node.js 作為異步事件驅(qū)動的JavaScript運行時,Node旨在構(gòu)建可伸縮的網(wǎng)絡(luò)應(yīng)用程序,在下面的hello world示例中,可以同時處理許多連...

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

    摘要:檢索新的事件執(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)核。 ...

    pingink 評論0 收藏0
  • Node.js 回調(diào)函數(shù) 阻塞與非阻塞

    摘要:回調(diào)函數(shù)在完成任務(wù)后就會被調(diào)用,使用了大量的回調(diào)函數(shù),所有的都支持回調(diào)函數(shù)。因此,阻塞是按順序執(zhí)行的,而非阻塞是不需要按順序的,所以如果需要處理回調(diào)函數(shù)的參數(shù),我們就需要寫在回調(diào)函數(shù)內(nèi)。 Node.js異步變成的直接體現(xiàn)就是回調(diào)。異步編程依托于回調(diào)來實現(xiàn),但不能說使用了回調(diào)后程序就異步化了。回調(diào)函數(shù)在完成任務(wù)后就會被調(diào)用,Node使用了大量的回調(diào)函數(shù),Node所有的APi都支持回調(diào)函數(shù)...

    big_cat 評論0 收藏0
  • Node.js 究竟是什么?

    摘要:在回調(diào)隊列中,函數(shù)等待調(diào)用棧為空,因為每個語句都執(zhí)行一次。最后一個運行,并且從調(diào)用棧中彈出。它將回調(diào)以先進先出順序移動到調(diào)用棧并執(zhí)行。 翻譯:瘋狂的技術(shù)宅原文: https://medium.freecodecamp.o... 本文首發(fā)微信公眾號:前端先鋒歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 Node.js 是一個 JavaScript 運行時環(huán)境。聽起來還不錯,不過這究竟...

    yeyan1996 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<