天天看點

同步異步與阻塞非阻塞

“阻塞”與”非阻塞”與”同步”與“異步”不能簡單的從字面了解,提供一個從分布式系統角度的回答。

1.同步與異步

同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)

所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不傳回。但是一旦調用傳回,就得到傳回值了。換句話說,就是由調用者主動等待這個調用的結果。

而異步則是相反,調用在發出之後,這個調用就直接傳回了,是以沒有傳回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在調用發出後,被調用者通過狀态、通知來通知調用者,或通過回調函數處理這個調用。

典型的異步程式設計模型比如Node.js舉個通俗的例子:你打電話問書店老闆有沒有《分布式系統》這本書,如果是同步通信機制,書店老闆會說,你稍等,”我查一下”,然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(傳回結果)。

而異步通信機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接挂電話了(不傳回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回調。

2. 阻塞與非阻塞

阻塞和非阻塞關注的是程式在等待調用結果(消息,傳回值)時的狀态.

阻塞調用是指調用結果傳回之前,目前線程會被挂起。調用線程隻有在得到結果之後才會傳回。

非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞目前線程。

還是上面的例子,你打電話問書店老闆有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“挂起”,直到得到這本書有沒有的結果,如果是非阻塞式調用,你不管老闆有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老闆有沒有傳回結果。在這裡阻塞與非阻塞與是否同步異步無關。跟老闆通過什麼方式回答你結果無關。

如果是關心blocking IO/ asynchronous IO, 參考 Unix Network Programming View Book

繼續閱讀