一、先来简单的理解
1.同步与异步
同步与异步是针对"请求"的,从宏观上把握执行结果
同步:调用者发起一次请求,没有得到结果之前,就一直等着。即:调用者一直等待结果返回,没有结果,就一直等,什么事也不干。 异步:调用者发起一次请求,被调用者马上返回请求成功,但是请求成功不代表结果处理完成。即:A调用B,B告诉A我拿到你的请求了(返回成功),等我处理完成了(处理结果),我通知你。这时候A就可以去干其他的事情了,没必要一直等着。2.阻塞与非阻塞
阻塞与非阻塞是针对"线程"的,从微观上把握执行过程
阻塞:在处理一次请求时,会有很多流程,假设有流程A、流程B、流程C三个,顺序执行,流程C执行完了就返回结果。现在当前线程走到流程B时,因为某种原因卡主了或者说需要执行很久,则当前线程挂起了,即称之为阻塞住了。 非阻塞:在处理一次请求时,会有很多流程,假设有流程A、流程B、流程C三个,当前线程执行A时,顺利结束,执行B时,会很花时间,则他去执行C,执行C完成了就返回结果,即当前线程不会因为某个点(执行B花很长时间)而等起。 二、列举详细的例子描述 场景:老李去修理铺修电瓶车 出场人物:老李、电瓶车、老板 1.同步阻塞:老李带上电瓶车去商铺找老板,说需要修理电瓶车,然后老李在商铺一直等着,等待老板将电瓶车修好,老李再骑上电瓶车回家。 点评:老李在等待期间,什么事都不能干,就一直等着。 2.同步非阻塞:老李带上电瓶车去商铺找老板,说需要修理电瓶车,老板回复说好,然后老李就回家(或者干其他事情去了)。然后老李时不时的返回到修理铺看下他的车子修好没有,这期间当然老李会来多次。----这在程序上体现为:轮询。 点评:老李在老板修车期间,可以干其他事情,只是老李时不时的去修理铺看下车子修好没有比较浪费时间。 3.异步阻塞:老李带上电瓶车去商铺找老板,说需要修理电瓶车,老板回复说"ok,车子修好了,我通知你过来取",但是老子一根筋,我就在这里等,就要等你修好了,我取车。 点评:真实的业务场景是不会有这种情况的。即真实的程序中不会这么使用 4.异步非阻塞:老李带上电瓶车去商铺找老板,说需要修理电瓶车,老板回复说"ok,车子修好了,我通知你过来取"。老李回复"嗯,要得",然后老李去干其他的事情了。老李既不需要在现场等,也不需要时不时的过来查看修车结果,老李完全被释放出来了,可以干其他的事情。 点评:异步一般配合非阻塞使用,才能发挥异步作用。很明显异步与阻塞一起使用时没有任何意义与价值。3.总结
实际的业务场景肯定是使用 同步阻塞 与 异步非阻塞。
同步阻塞:前端调用后端接口,需要根据接口返回的数据进行页面渲染,即后端没有返回数据,则前端无法渲染,所以,前端需要一直等后端结果。 异步非阻塞:两个后端进行交互,后端A请求后端B的接口,这个接口B要处理很多事情,B处理完了回调A,通知A处理结果。举例:A将视频放在存储webtv/alibaba/video/tengxun.mp4位置上,然后请求B,告诉B视频在存储上位置,B立马返回A:ok,A拿到ok后,就干其他的事情了。此时B开始对视频进行转码、抽帧等一系列事情,处理完后,结果可能成功与失败,都会通知A处理结果。