博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
综合技术----同步、异步、阻塞与非阻塞的理解
阅读量:6496 次
发布时间:2019-06-24

本文共 1389 字,大约阅读时间需要 4 分钟。

hot3.png

一、先来简单的理解

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处理结果。

转载于:https://my.oschina.net/u/2312022/blog/3038258

你可能感兴趣的文章
iOS国际化(多语言设置)
查看>>
bzoj 2733 平衡树启发式合并
查看>>
sublime简书安装配置
查看>>
爱上MVC~Web.Config的Debug和Release版本介绍
查看>>
条款03 尽可能使用const
查看>>
【转】那些年我们一起清除过的浮动
查看>>
python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法...
查看>>
【每天一道算法题】时间复杂度为O(n)的排序
查看>>
NLog的介绍使用
查看>>
Haproxy+Rabbitmq中的问题
查看>>
字符串变量小议
查看>>
232. Implement Queue using Stacks
查看>>
Poj(1469),二分图最大匹配
查看>>
和菜鸟一起学linux之V4L2摄像头应用流程【转】
查看>>
spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】
查看>>
删除 mac 垃圾桶内清除不掉的文件
查看>>
【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
查看>>
/bin/bash^M: bad interpreter: No such file or dire
查看>>
python xml rpc
查看>>
Java设置以及获取JavaBean私有属性进阶
查看>>