怎樣理解同步異步和阻塞非阻塞

今天跟公司同事討論了下同步異步,阻塞非阻塞,在這里做下總結,同時也發(fā)現(xiàn)很多同學(包括之前我)對同步異步,阻塞非阻塞的概念理解不太清晰。

之前看過一個很形象的例子來說明同步異步阻塞非阻塞。
場景: 小明使用 chrome 下載一個軟件。

1. 同步阻塞

小明使用 沒有提醒功能的chrome 下載一個軟件。小明 一直坐在電腦面前什么事也不做, 等待軟件下載完成。
阻塞:小明(調(diào)用者) 等待電腦下載完成,什么事也不做(當前進程掛起) 。
同步: 沒有提醒功能的 chrome(被調(diào)用者)
總結: 調(diào)用結果返回前,進程掛起,等待調(diào)用結果返回。效率低

2.異步阻塞

小明使用 有提醒功能的chrome(下載完成會 '叮'一聲提醒用戶) 下載軟件。小明一直坐在電腦前什么事也不做,等待軟件下載完成。
阻塞:小明(調(diào)用者) 等待電腦下載完成,什么事也不做(當前進程掛起)。
異步:有提醒功能的 chrome,下載完成的時候會提醒小明。(調(diào)用結果返回時會通知進程)
總結:雖然調(diào)用結果返回會通知進程,但是調(diào)用結果返回前,當前進程掛起。所以同樣效率低

這里我們可以看出,同步和異步是一種 消息通知機制, 是相對于被調(diào)用者而言的。

同步:

A調(diào)用B,B處理直到獲得結果,才返回給A。
需要調(diào)用者一直等待和確認調(diào)用結果是否返回, 然后繼續(xù)往下執(zhí)行。

異步:

A調(diào)用B,B直接返回。無需等待結果,B通過狀態(tài),通知等來通知A或回調(diào)函數(shù)來處理。
調(diào)用結果返回時, 會以消息或回調(diào)的方式通知調(diào)用者。

3.同步非阻塞

小明使用 沒有提醒功能的chrome 下載軟件,然后去做其他事情,時不時的過來確認下軟件是否下載完成(輪詢?)。小明做其他事情的效率不高。
非阻塞: 小明 (調(diào)用者) 執(zhí)行需要等待的任務后,去做其他事情。
同步:沒有提醒功能的 chrome(被調(diào)用者)需要 小明(調(diào)用者) 確認是否完成任務。
總結:調(diào)用結果返回前不會阻塞當前進程,當前進程可以去做其他事情,但是需要通過輪詢來確認調(diào)用結果是否返回,耗cpu性能,效率會比 1,2 高點。但是還不夠高

4.異步非阻塞

小明使用 有提醒功能的chrome 下載軟件, 然后去做其他事,當軟件下載完成的時候會通知小明。
非阻塞: 小明 (調(diào)用者) 執(zhí)行需要等待的任務后,去做其他事情。
異步: 有通知功能的 chrome (被調(diào)用者) 下載完成后會通知 小明(調(diào)用者)。
總結:調(diào)用結果返回前當前進程可以繼續(xù)做其他事情,函數(shù)調(diào)用完成后會以回調(diào)或者消息的方式通知進程。效率最高。

這里我們可以看出 阻塞非阻塞 描述的是進程等待調(diào)用結果返回前的狀態(tài), 是相對于調(diào)用者而言的。

阻塞:

A調(diào)用B,A被掛起直到B返回結果給A,A繼續(xù)執(zhí)行。
調(diào)用結果返回前,當前進程掛起不能夠處理其他任務,一直等待調(diào)用結果返回。

非阻塞:

A調(diào)用B,A不會被掛起,A可以執(zhí)行其他操作。
調(diào)用結果返回前,當前進程不掛起, 可以去處理其他任務。

所以我們要區(qū)分開同步異步阻塞非阻塞,同步異步說的是被調(diào)用者結果返回時通知進程的一種通知機制,阻塞非阻塞說的是調(diào)用結果返回前進程的狀態(tài),是掛起還是繼續(xù)處理其他任務。

python 的 tornado 框架就是一種異步非阻塞框架。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容