曾经有一段时间,在我的理解中,同步就是阻塞,异步就是非阻塞。可不就是这样吗?从代码执行的角度来看,确实如此。但随着了解的深入,概念和场景的拓展,有了不一样的理解。试分析之,难免疏漏,欢迎指正。
——题记
一、同步和异步、阻塞和非阻塞
这四个概念两两组合,会形成4个新的概念。如下所示:
1.同步阻塞
客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端则被服务端阻塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其他任何事,服务端也不会接收其他客户端的请求。这种通信机制比较简单粗暴,但是效率不高。
2.同步非阻塞
客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会再因为任务没有处理完而堵着,所以这是非阻塞的。
3.异步阻塞
客户端发送请求给服务端,此时服务端处理任务时间很久,但是客户端不会等待服务器响应,它可以做其他事,等服务器处理完毕后再把结果响应给客户端,客户端得到回调后再处理服务端的响应。这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的ajax异步请求。
4.异步非阻塞
客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是异步的,可以在回调函数里处理响应;同时服务端是非阻塞的,所以服务端可以去处理其他的任务,如此,这个模式就显得非常高效了。
二、一个例子
以排队吃饭为例:
- 同步就是你需要自己每隔一段时间,以轮询的方式去看看是否有空位;
- 异步就是有空位了会有人通知你去吃饭;
- 阻塞就是在等待的过程中,你不去做其他事情,干等着;
- 非阻塞就是你在等待过程中可以去做其他事情,比如玩手机、抽烟和烫头。
三、小结
异步的优显而易见,大大优化用户体验,非阻塞使得系统资源开销远远小于阻塞模式,因为系统不需要创建新的进程或线程,大大节约了系统的资源,如此多出来的资源可以给其他中间件去服务了。