因為昨天的FileSystem提到了同步與異步(或稱非同步),所以今天的主題就是這個了。

阻塞與非阻塞

阻塞非阻塞主要是描述請求在等待結果時的狀態

假設今天有一個請求要讀取檔案,但是今天這個檔案被請求時是不可讀取的狀態。

如果設計是阻塞的,那麼這個請求便會進入等待狀態,直到它終於讀取到這個檔案,或者是等待久不想等了,才會換下一個。

如果設計是非阻塞的,那麼這個請求會因為檔案不能不讀取而立刻返回,不會在那邊乾等,而是去做其他事情,然後過一定時間再回來看檔案可不可以讀取,然後一直重複,直到檔案可以被讀取為止。

同步與異步

同步異步主要是描述回傳的聯絡方式

一樣假設今天有一個請求要讀取檔案,但是這個檔案還是一樣不能被讀取。

如果設計是同步的,那麼被請求方在請求來的時候,請求方將不會得到任何回傳,除非請求來的時候,這個檔案是可以被讀取的,被請求方才會正常地回傳檔案給請求方。

如果設計是異步的,那麼管理檔案的程序會立刻回傳訊息給請求說:「檔案現在不能用,好了跟你說」,等這個檔案可以被讀取時,便會通知請求。

綜合比較

  • 阻塞同步:基本上就是最直觀但最沒效率的方式,一個請求進來,請求方會一直等它的檔案,而被請求方在檔案準備好之前不會做任何回覆,兩個人都會卡在那直到事情完成。

    舉例:一堆人到星巴克櫃檯買咖啡,每一個買咖啡的人都會一直站在櫃檯前一直等,直到櫃檯給他咖啡。

  • 非阻塞同步:請求方變聰明了,請求如果當下沒得到回覆,它會跑去做其他的事情,但是因為被請求方還是不會主動通知,所以每隔一段時間就要重新送一次請求。

    舉例:買咖啡的人變聰明了,他會去旁邊滑滑手機做其他事,但是櫃檯人員不會主動跟客人說咖啡好了,變成客人每五分鐘要去問咖啡好了沒,對客人來說還是很沒效率。

  • 阻塞異步:被請求方變聰明了,不管檔案是否可以被讀取,都會回傳訊息給請求方,但是請求方怎麼樣都會等待,所以會不會通知根本沒差。

    舉例:櫃檯變聰明了,他會主動通知客人咖啡好了,但是客人不管怎麼樣都還是會佔著櫃檯等他的咖啡,所以有通知跟沒通知一樣。

  • 非阻塞異步:這就是目前比較有效率的處理方式,假設檔案一樣無法被讀取,請求方送出請求時,被請求方會立刻回傳檔案被使用的訊息,而請求方也會乖乖離開去做其他事,被請求方則會在檔案可以讀取時主動通知請求方。

    舉例:兩個人都變聰明了,客人到櫃台前去買咖啡,得到櫃檯人員給的號碼牌後就離開櫃檯,櫃檯人員則繼續幫下一個人點餐,當客人的咖啡準備好時,櫃檯人員就會主動呼叫號碼,叫客人前來領取咖啡。