如何理解阻塞非阻塞與同步非同步的?
最近在看Node.js相關內容,對單執行緒函式式非同步程式設計不是很瞭解,於是蒐集了相關資料整理了一下自己的思路,來談談我對阻塞非阻塞,同步與非同步程式設計的區別(如有見解不當的地方,望指出,定會積極吸取)。
先舉一個通俗的例子然後在做分析:
- 同步於非同步
同步:今天你去超市買東西,你打電話問女友今天吃什麼,然後女友說:”讓我想一想,想一想~”這一想可能很長時間,你在旁邊等著直到她說我想吃: “紅燒肉”(結果返回)然後你就去買食材。
非同步: 你打電話問老媽紅燒肉怎麼做,她說:”有點麻煩,一時半會兒說不全(程式複雜,費時),等我理好思路之後給你發微信吧”(通過狀態,通知或者回撥函式通知呼叫者)。這時候你不用等待,去買其他東西了。(立即處理執行後面的程式)
同步和非同步關注的是訊息通訊機制
所謂同步,就是在發出一個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由呼叫者主動等待這個呼叫的結果。
而非同步則是相反,呼叫在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在呼叫發出後,被呼叫者通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。
- 阻塞與非阻塞
阻塞:你在超市食材區排隊買肉,這時候貨架上肉賣完了,需要等待售貨員詢問是否還有肉,這時候你就一直在等(執行緒被掛起),直到新的肉到來或者庫存已空(結果返回)。
非阻塞:你在超市除了想買食材還想買水果,買日用品等,這時候你不打電話了,發微信給女友說:“你想吃什麼,想好告訴我,我正在超市買東西”。這時候你不用等她立即回覆,你去買水果,日用品等,但主要目的買菜還沒得到回覆,所以你時不時的去看一下微信(輪詢檢視是否返回結果)
阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態
阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。