1 举个简单的栗子:假如你今天去银行办理业务,排队的人还真不少
--同步非阻塞 在等待的时候你可以打电话发短信(非阻塞),同时还要自己不断观察排队情况(同步轮询)
--同步阻塞 在等待的时候你什么也不能干(阻塞),唯一能做的只有不停观察排队情况(同步轮询)
--异步非阻塞 不需要多余的等待,自助出号机上领个排队号然后想干嘛干嘛去(非阻塞),当轮到你的时候柜台服务人员大喇叭或电话通知轮到你了快来办理(异步)
总结:同步与异步是基于服务端是否先立刻返回等完全执行完再回调通知还是一直等到执行完才返回结果,阻塞非阻塞是基于客户端是否一直在等待。
2 IO模型
--同步阻塞 进程执行io(socket)操作的时候阻塞直到内核返回数据
--同步非阻塞 进程执行io(socket)操作的时候如果执行未完成则内核返回错误不阻塞请求进程,同时会不断轮询请求操作完成与否
--异步阻塞(io多路复用) select监听所有socket并不知道哪个socket有事件需要轮询后再操作,epoll监听socket返回有事件的socket文件描述符;select会先阻塞请求进程,有请求操作事件发生后再去执行。实际中使用观察者设计模式会注册感兴趣的事件,而不是所有事件都需要。
--异步非阻塞io 进程执行io(socket)操作的时候内核直接先返回,进程可以做其他任何其他操作不阻塞;内核执行完成相关操作通知进程操作完成。需要操作系统支持用的较少。
总结:nginx高性能服务器则是基于多进程+IO多路复用模型epoll模型实现高并发。
web服务主要是io密集型服务;那么事件驱动更适合于I/O密集型服务,多进程或线程适合于CPU密集型服务(当然python的多线程有全局锁除外。。ß)。
网友评论