是同步还是异步_同步、异步、阻塞、非阻塞

09014a1735f70ad30ecce69f92364ee7.png

老是搞混这几个名词,决定花时间去理解他。

阻塞、非阻塞和同步、异步的区别

阻塞、非阻塞和同步、异步其实针对的对象是不一样的。

阻塞、非阻塞说的是调用者。

同步、异步说的是被调用者。

认为阻塞和同步是一回事儿,非阻塞和异步是一回事。这是不对的。

从专业上来说:

阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;(程序在等待调用结果(消息,返回值)时的状态)。

同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写;(消息通信机制)。

网上也有很多相应的例子:例如烧水过程,查书过程等,当时看的时候是明白了,过一阵又忘了,实则不得要领。

举出一个我理解的例子:

餐厅订餐:

当我去到餐厅吃饭的时候,向服务员下单(程序执行),就会出现两种情况:

情况一:不断向服务员询问,菜做好了没有(阻塞,进程一直等待)

情况二:隔一段时间再询问服务员,其中在玩手机或者发呆(非阻塞,进程去做别的事情或睡眠状态)

当我问服务员菜好了没,服务员有两种响应方式:

响应一:一直不回话,等到菜好了,才告诉我。(同步)

响应二:马上回答说,好了叫你。(异步)

到这里就会发现几种组合:

我一直不间断的询问服务员菜好了没,服务员等到菜好了,才告诉我。(同步阻塞)

或者我偶尔询问一下服务员(期间我在玩手机),服务员等到菜好了,才告诉我(同步非阻塞)

异步也是一样。

有人就会有疑问了:服务员在同步的时候不也是阻塞的吗?

因为关注方不一样,一开始关注的是我的调用者,产生疑问的时候其实是把服务员当成调用者,这样会才引起误会。

当服务员为调用者的时候,就有可能是阻塞的状态,但却是相对于厨师而言的。

符合我们开头所说的:

阻塞、非阻塞和同步、异步其实针对的对象是不一样的。

阻塞、非阻塞说的是调用者。

同步、异步说的是被调用者。

程序来源于生活,希望大家有自己不同的理解。


go手码的CI/CD部署系统,https://github.com/zhenorzz/goploy,star一下呗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值