什麼是Node.js的阻塞與非阻塞、同步與異步?

2021-01-20 SOWORD科技言

你可能已經聽說Node.js是「基於Chrome的V8 JavaScript引擎的異步JavaScript運行的」,並且它「使用事件驅動的非阻塞I / O模型,使其輕量級和高效」。但對某些人來說,這不是最好的解釋,或許太過於概念化。

首先要了解什麼是Node.js?其次要知道Node.js究竟「異步」與「同步」有什麼不同意思?還要討論,「事件驅動」和「非阻塞」的含義是什麼?

什麼是Node.js

Node只是一個環境或運行時,可以在瀏覽器之外運行普通的JavaScript(略有不同)。

我們可以使用它來構建桌面應用程式(使用像Electron這樣的框架),編寫Web或app伺服器等等。

阻塞/非阻塞和同步/異步

假設我們正在進行資料庫調用以檢索有關用戶的屬性,該調用需要時間,如果請求是「阻塞」,那麼這意味著它將阻止我們的程序執行,直到調用完成。在這種情況下,我們發出了「同步」請求,它最終阻止了線程。

因此,同步操作會阻塞進程或線程,直到該操作完成,使線程處於「等待狀態」。一個異步操作,在另一方面,是非阻塞的,它允許執行線程繼續進行,無論操作完成所花費的時間或完成操作的結果如何,並且線程的任何部分都不會在任何時候進入等待狀態。

讓我們看一下阻塞線程的同步調用的另一個例子。假設我們正在構建一個應用程式,用於比較兩個Weather API的結果,以找出它們的差異化。我們以阻塞的方式調用Weather API One並等待結果。得到結果後,我們調用Weather API Two並等待其結果。

請允許我個人指出一個問題:重要的是要認識到並非所有同步調用都必然是阻塞的。

如果同步操作可以設置完成而不阻塞線程或導致等待狀態,則它是非阻塞的。大多數情況下,同步調用將被阻塞,完成所需的時間取決於多種因素,例如API伺服器的速度,最終用戶的網際網路連接下載速度等。

對於上圖,我們不得不等待一段時間才能從API One中檢索第一批結果。此後,我們不得不等待同樣的時間來獲得API Two的回覆。

在非阻塞調用的情況下,我們會有這樣的事情:

你可以清楚地看到我們完成執行的速度有多快,而不是等待API One然後等待API Two,我們可以等待它們同時完成並將調用速度提高近50%。

因此請注意,一旦我們調用了API One並開始等待它的響應,我們也調用了API Two並開始等待它的同時響應它。

我們相信通過實驗測試之後,相信很多人會更加了解阻塞,非阻塞,和同步,異步的使用。

相關焦點

  • 同步,異步,阻塞,非阻塞
    同步與異步關注的是消息通知的機制,而阻塞與非阻塞關注的是程序(線程)等待消息通知時的狀態。以下載文件打個比方。同步阻塞:一直盯著下載進度條,到 100% 的時候就完成。同步體現在:等待下載完成通知;阻塞體現在:等待下載完成通知過程中,不能做其他任務處理;同步非阻塞:提交下載任務後就去幹別的,每過一段時間就去看一眼進度條,當是 100% 就完成。
  • 聊聊同步、異步、阻塞與非阻塞
    經過看了些這幾個概念的資料,發現同步、異步、阻塞、非阻塞的概念其實也並不難以理解,在此寫下此文,歡迎拍磚,希望多多交流。2 阻塞與非阻塞阻塞和非阻塞這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態有關。
  • 重新認識同步與異步,阻塞和非阻塞的概念
    ,尤其是在一些場景下同步與阻塞,異步與非阻塞感覺沒啥區別,但其實這四個術語描述的事物還真不是一回事。下面我們來慢慢探討他們之間的區別與聯繫,在這之前,我們還會經常看到下面的組合術語:(一)同步+阻塞(二)同步+非阻塞(三)異步+阻塞(四)異步+非阻塞在當什麼是同步和異步,阻塞與非阻塞的概念還沒弄清楚之前,更別提上面這些組合術語了,只會讓你更加困惑。
  • 概念辨析:同步/異步,阻塞/非阻塞
    同步與異步同步與異步要從服務調用方的視角區分.阻塞與非阻塞阻塞與非阻塞是針對 CPU 而言的.以上面的例子繼續談, 當調用方調用一個同步 API 時, 在等待服務方返回結果期間,如果調用方的 CPU 也陷入等待, 那麼這就是阻塞的;如果調用的 CPU 掛起, 趁機去執行其他的操作, 那麼這就是非阻塞的.
  • 一篇文章講解同步/異步,阻塞,非阻塞
    同步/異步,阻塞/非阻塞一篇文章徹底弄懂os #作業系統 課程開始之前,我們先看一個假設:小明有一天和他的母親,王叔叔在家,小明母親讓小明去小區門口看著他的父親是否開車回來,如果開車回來,那麼就給他的母親打個電話。
  • Python基礎必備知識:同步異步阻塞非阻塞
    所謂異步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務無法確定,所以它是不可靠的任務序列。
  • 「漫畫」「同步異步阻塞非阻塞」
    本文轉載自【微信公眾號:小碼逆襲,ID:gh_7c5a039380a0】經微信公眾號授權轉載,如需轉載與原文作者聯繫我相信很多人看到這四個詞語:阻塞、非阻塞、同步、異步都很容易混淆,傻傻分不清楚,這四個詞又是面試中面試官很喜歡問的,當初我在面試騰訊的時候就被面試官追著問同步和阻塞的區別
  • IO復用,AIO,BIO,NIO同步,異步,阻塞和非阻塞區別
    二、同步異步,阻塞非阻塞區別聯繫 實際上同步與異步是針對應用程式與內核的交互而言的。同步過程中進程觸發IO操作並等待(也就是我們說的阻塞)或者輪詢的去查看IO操作(也就是我們說的非阻塞)是否完成。 異步過程中進程觸發IO操作以後,直接返回,做自己的事情,IO交給內核來處理,完成後內核通知進程IO完成。
  • NIO、BIO、AIO、同步異步、阻塞非阻塞傻傻分不清楚?
    阻塞IO非阻塞IO同步與異步同步與異步是基於應用程式和作業系統處理IO事件所採用的方式:同步:應用程式要直接參與IO讀寫的操作。異步:所有的IO操作交給作業系統去處理,應用程式只需要等待通知。同步IO異步IONIO與BIO的區別總結NIOBIO基於緩衝區( Buffer )基於流( Stream )非阻塞 IO阻塞 IO選擇器( Selector )無BIOBlocking IO,是同步阻塞的IO模型,傳統的IO【java.io包】就是這種模型。
  • Nginx專題之-一文就懂同步和異步阻塞和非阻塞(深入才更懂得)
    、同步與異步的知識。01阻塞與非阻塞阻塞和非阻塞主要是指作業系統或底層的C庫提供的方法或系統的調用,我們調用這些方法可能會導致我的進程sleep的狀態。為什麼會進入sleep狀態,應為當前的條件無法滿足,作業系統會主動把我的進程切換到另外一個進程上繼續等待,這就是一種阻塞的方法。
  • 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?
    但是,對於同步阻塞、同步非阻塞、異步這些概念,還是比較的模糊,一直處於似懂非懂的狀態。所以這兩天,一直在網上看看大家對此的評論,也得到了一些啟發。三、Java 中 IO 和 NIO我們都知道 Java 中:IO 是同步阻塞,而 NIO 是同步非阻塞;而經過上面關於 Liunx 網絡 I/O 模型的解讀,我們都已經比較清楚地了解了同步異步和阻塞非阻塞的概念。
  • Java Sockets I/O: 阻塞、非阻塞與異步(二)
    譯者註:作為一個沒學過作業系統知識而直接學編程的人,對於阻塞、非阻塞、異步的認知,總感覺隔著一層紗。自上次翻譯過 《Event Loop 解疑》 後,它讓我對異步的理解深入了一些,趁熱打鐵,再譯一篇相關的主題。文章比較長,將分為多篇展開。
  • socket阻塞和非阻塞的區別
    ,我們常常見到同步、異步、阻塞和非阻塞四種調用方式。       同步 所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。按照這個定義,其實絕大多數函數都是同步調用(例如sin, isdigit等)。但是一般而言,我們在說同步、異步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 SendMessage。該函數發送一個消息給某個窗口,在對方處理完消息之前,這個函數不返回。
  • 系統性學習 Node.js(1)- Node.js 基礎概念
    Node.js 是什麼都 2020 年了,大家對 Node 肯定都有了初步的了解,但是我還是想先介紹一下什麼是 NodeNode.js是一個基於 Chrome V8 引擎的JavaScript運行環境(runtime)。
  • 「譯」理解 Node.js 的中 Worker Threads
    原文:https://nodesource.com/blog/worker-threads-nodejs理解 Node 的底層對於理解 Workers 是很有必要的。事件循環:這是 Node.js 中需要重點理解的一個部分,儘管 JavaScript 是單線程的,但通過使用回調,promises, async/await 等語法,基於事件循環將對作業系統的操作異步化,使得 Node 擁有異步非阻塞 IO 的特性。一個 JS 引擎實例:即一個可以運行 JavaScript 代碼的程序。
  • Kafka Producer 異步發送消息居然也會阻塞?
    Kafka 一直以來都以高吞吐量的特性而家喻戶曉,就在上周,在一個性能監控項目中,需要使用到 Kafka 傳輸海量消息,在這過程中遇到了一個 Kafka Producer 異步發送消息會被阻塞的問題,導致生產端發送耗時很大。
  • 基操勿 6 | Node.js 的異步 I/O 到底有多秀?
    毫不誇張地講,正是因為有了 Node.js,才有了今天前端的蓬勃發展。在 Node.js 加持下,JS 和 其它程式語言比較,有著與眾不同的特點。(或者說,讀取文件大小這些小任務之間是『非阻塞』的)/code"))console.timeEnd("同步")// 統計異步版本用時console.time("異步")dirSizeAsync(".
  • Python進程池(阻塞和異步非阻塞)
    第四個任務等待(進程池已滿)第一個任務結束,第四個任務開始Pool類的實例方法(apply與apply_async):pool.apply_async()apply主進程會被阻塞到函數執行結束apply_async 是異步非阻塞的意思就是:不用等待當前進程執行完畢,隨時根據系統調度來進行進程切換。我們進入看源碼,可以發現我們是要傳入一個函數名,而不是一個函數,參數就用tuple,或者字典。
  • Node.js 學習資料和教程(值得收藏)
    Node.jsHomePageNode官網七牛鏡像Infoq深入淺出Node.js系列(進階必讀)Node.js中文文檔被誤解的 Node.jsNode.js C++ addon編寫實戰系列熱門node.js模塊排行榜,方便找出你想要的模塊nodejs多線程,真正的非阻塞淺析nodejs的buffer類利用libuv編寫異步多線程的addon實例Node.js
  • 深入理解Node.js事件驅動模型
    本文主要討論如下問題:Node.js事件驅動模型分析Node.js是如何處理高並發請求的Node.js的缺點介紹首先對Node.js做個簡單介紹,Node.js是一個基於事件驅動、非阻塞式的I/O模型來實現的服務端JavaScript運行環境,是基於Google的V8