今天跟公司同事討論了下同步異步,阻塞非阻塞宵喂,在這里做下總結(jié),同時(shí)也發(fā)現(xiàn)很多同學(xué)(包括之前我)對同步異步碎罚,阻塞非阻塞的概念理解不太清晰磅废。
之前看過一個(gè)很形象的例子來說明同步異步阻塞非阻塞。
場景: 小明使用 chrome 下載一個(gè)軟件荆烈。
1. 同步阻塞
小明使用 沒有提醒功能的chrome 下載一個(gè)軟件拯勉。小明 一直坐在電腦面前什么事也不做, 等待軟件下載完成憔购。
阻塞:小明(調(diào)用者) 等待電腦下載完成宫峦,什么事也不做(當(dāng)前進(jìn)程掛起) 。
同步: 沒有提醒功能的 chrome(被調(diào)用者)
總結(jié): 調(diào)用結(jié)果返回前玫鸟,進(jìn)程掛起导绷,等待調(diào)用結(jié)果返回。效率低
2.異步阻塞
小明使用 有提醒功能的chrome(下載完成會 '叮'一聲提醒用戶) 下載軟件屎飘。小明一直坐在電腦前什么事也不做妥曲,等待軟件下載完成贾费。
阻塞:小明(調(diào)用者) 等待電腦下載完成,什么事也不做(當(dāng)前進(jìn)程掛起)檐盟。
異步:有提醒功能的 chrome褂萧,下載完成的時(shí)候會提醒小明。(調(diào)用結(jié)果返回時(shí)會通知進(jìn)程)
總結(jié):雖然調(diào)用結(jié)果返回會通知進(jìn)程葵萎,但是調(diào)用結(jié)果返回前导犹,當(dāng)前進(jìn)程掛起。所以同樣效率低
這里我們可以看出羡忘,同步和異步是一種 消息通知機(jī)制谎痢, 是相對于被調(diào)用者而言的。
同步:
A調(diào)用B壳坪,B處理直到獲得結(jié)果舶得,才返回給A。
需要調(diào)用者一直等待和確認(rèn)調(diào)用結(jié)果是否返回爽蝴, 然后繼續(xù)往下執(zhí)行沐批。
異步:
A調(diào)用B,B直接返回蝎亚。無需等待結(jié)果九孩,B通過狀態(tài),通知等來通知A或回調(diào)函數(shù)來處理发框。
調(diào)用結(jié)果返回時(shí)躺彬, 會以消息或回調(diào)的方式通知調(diào)用者。
3.同步非阻塞
小明使用 沒有提醒功能的chrome 下載軟件梅惯,然后去做其他事情宪拥,時(shí)不時(shí)的過來確認(rèn)下軟件是否下載完成(輪詢?)铣减。小明做其他事情的效率不高她君。
非阻塞: 小明 (調(diào)用者) 執(zhí)行需要等待的任務(wù)后,去做其他事情葫哗。
同步:沒有提醒功能的 chrome(被調(diào)用者)需要 小明(調(diào)用者) 確認(rèn)是否完成任務(wù)缔刹。
總結(jié):調(diào)用結(jié)果返回前不會阻塞當(dāng)前進(jìn)程,當(dāng)前進(jìn)程可以去做其他事情劣针,但是需要通過輪詢來確認(rèn)調(diào)用結(jié)果是否返回校镐,耗cpu性能,效率會比 1捺典,2 高點(diǎn)鸟廓。但是還不夠高
4.異步非阻塞
小明使用 有提醒功能的chrome 下載軟件, 然后去做其他事,當(dāng)軟件下載完成的時(shí)候會通知小明肝箱。
非阻塞: 小明 (調(diào)用者) 執(zhí)行需要等待的任務(wù)后哄褒,去做其他事情。
異步: 有通知功能的 chrome (被調(diào)用者) 下載完成后會通知 小明(調(diào)用者)煌张。
總結(jié):調(diào)用結(jié)果返回前當(dāng)前進(jìn)程可以繼續(xù)做其他事情呐赡,函數(shù)調(diào)用完成后會以回調(diào)或者消息的方式通知進(jìn)程。效率最高骏融。
這里我們可以看出 阻塞非阻塞 描述的是進(jìn)程等待調(diào)用結(jié)果返回前的狀態(tài)链嘀, 是相對于調(diào)用者而言的。
阻塞:
A調(diào)用B档玻,A被掛起直到B返回結(jié)果給A怀泊,A繼續(xù)執(zhí)行。
調(diào)用結(jié)果返回前误趴,當(dāng)前進(jìn)程掛起不能夠處理其他任務(wù)霹琼,一直等待調(diào)用結(jié)果返回。
非阻塞:
A調(diào)用B凉当,A不會被掛起枣申,A可以執(zhí)行其他操作。
調(diào)用結(jié)果返回前看杭,當(dāng)前進(jìn)程不掛起忠藤, 可以去處理其他任務(wù)。
所以我們要區(qū)分開同步異步阻塞非阻塞楼雹,同步異步說的是被調(diào)用者結(jié)果返回時(shí)通知進(jìn)程的一種通知機(jī)制模孩,阻塞非阻塞說的是調(diào)用結(jié)果返回前進(jìn)程的狀態(tài),是掛起還是繼續(xù)處理其他任務(wù)贮缅。
python 的 tornado 框架就是一種異步非阻塞框架榨咐。