1 舉個(gè)簡單的栗子:假如你今天去銀行辦理業(yè)務(wù)球恤,排隊(duì)的人還真不少
--同步非阻塞 在等待的時(shí)候你可以打電話發(fā)短信(非阻塞),同時(shí)還要自己不斷觀察排隊(duì)情況(同步輪詢)
--同步阻塞 在等待的時(shí)候你什么也不能干(阻塞)荸镊,唯一能做的只有不停觀察排隊(duì)情況(同步輪詢)
--異步非阻塞 不需要多余的等待咽斧,自助出號(hào)機(jī)上領(lǐng)個(gè)排隊(duì)號(hào)然后想干嘛干嘛去(非阻塞),當(dāng)輪到你的時(shí)候柜臺(tái)服務(wù)人員大喇叭或電話通知輪到你了快來辦理(異步)
總結(jié):同步與異步是基于服務(wù)端是否先立刻返回等完全執(zhí)行完再回調(diào)通知還是一直等到執(zhí)行完才返回結(jié)果躬存,阻塞非阻塞是基于客戶端是否一直在等待张惹。
2 IO模型
--同步阻塞 進(jìn)程執(zhí)行io(socket)操作的時(shí)候阻塞直到內(nèi)核返回?cái)?shù)據(jù)
--同步非阻塞 進(jìn)程執(zhí)行io(socket)操作的時(shí)候如果執(zhí)行未完成則內(nèi)核返回錯(cuò)誤不阻塞請求進(jìn)程,同時(shí)會(huì)不斷輪詢請求操作完成與否
--異步阻塞(io多路復(fù)用) select監(jiān)聽所有socket并不知道哪個(gè)socket有事件需要輪詢后再操作岭洲,epoll監(jiān)聽socket返回有事件的socket文件描述符宛逗;select會(huì)先阻塞請求進(jìn)程,有請求操作事件發(fā)生后再去執(zhí)行盾剩。實(shí)際中使用觀察者設(shè)計(jì)模式會(huì)注冊感興趣的事件雷激,而不是所有事件都需要。
--異步非阻塞io 進(jìn)程執(zhí)行io(socket)操作的時(shí)候內(nèi)核直接先返回告私,進(jìn)程可以做其他任何其他操作不阻塞屎暇;內(nèi)核執(zhí)行完成相關(guān)操作通知進(jìn)程操作完成。需要操作系統(tǒng)支持用的較少驻粟。
總結(jié):nginx高性能服務(wù)器則是基于多進(jìn)程+IO多路復(fù)用模型epoll模型實(shí)現(xiàn)高并發(fā)根悼。
web服務(wù)主要是io密集型服務(wù);那么事件驅(qū)動(dòng)更適合于I/O密集型服務(wù)蜀撑,多進(jìn)程或線程適合于CPU密集型服務(wù)(當(dāng)然python的多線程有全局鎖除外挤巡。。?)酷麦。