怎樣理解阻塞非阻塞與同步異步的區別?

如何理解阻塞非阻塞與同步異步的區別?

最近在看Node.js相關內容,對單線程函數式異步編程不是很瞭解,於是蒐集了相關資料整理了一下自己的思路,來談談我對阻塞非阻塞,同步與異步編程的區別(如有見解不當的地方,望指出,定會積極吸取)。




同步與異步


先舉一個通俗的例子然後在做分析:

**同步**:今天你去超市買東西,你打電話問女友今天吃什麼,然後女友說:"讓我想一想,想一想~"這一想可能很長時間,你在旁邊等着直到她說我想吃: "紅燒肉"(結果返回)然後你就去買食材。

**異步**:你打電話問老媽紅燒肉怎麼做,她說:"有點麻煩,一時半會兒說不全(程序複雜,費時),等我理好思路之後給你發微信吧"(通過狀態,通知或者回調函數通知調用者)。這時候你不用等待,去買其他東西了。(立即處理執行後面的程序)

**同步和異步關注的是消息通信機制**
所謂同步,就是在發出一個**調用**時,在沒有得到結果之前,該**調用**就不返回。但是一旦調用返回,就得到返回值了。換句話說,就是由*調用者*主動等待這個*調用*的結果。

還是上一個例子:

**阻塞**:你在超市食材區排隊買肉,這時候貨架上肉賣完了,需要等待售貨員詢問是否還有肉,這時候你就一直在等(線程被掛起。。),直到新的肉到來或者庫存已空(結果返回)。

**非阻塞**:你在超市除了想買食材還想買水果,買日用品等,這時候你不打電話了,發微信給女友說:“你想吃什麼,想好告訴我,我正在超市買東西”。這時候你不用等她立即回覆,你去買水果,日用品等,但主要目的買菜還沒得到回覆,所以你時不時的去看一下微信(輪詢查看是否返回結果)

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)的狀態
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後纔會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。



node.js就屬於典型的異步非阻塞編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章