老是搞混这几个名词,决定花时间去理解他。
阻塞、非阻塞和同步、异步的区别
阻塞、非阻塞和同步、异步其实针对的对象是不一样的。
阻塞、非阻塞说的是调用者。
同步、异步说的是被调用者。
认为阻塞和同步是一回事儿,非阻塞和异步是一回事。这是不对的。
从专业上来说:
阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;(程序在等待调用结果(消息,返回值)时的状态)。
同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写;(消息通信机制)。
网上也有很多相应的例子:例如烧水过程,查书过程等,当时看的时候是明白了,过一阵又忘了,实则不得要领。
举出一个我理解的例子:
餐厅订餐:
当我去到餐厅吃饭的时候,向服务员下单(程序执行),就会出现两种情况:
情况一:不断向服务员询问,菜做好了没有(阻塞,进程一直等待)
情况二:隔一段时间再询问服务员,其中在玩手机或者发呆(非阻塞,进程去做别的事情或睡眠状态)
当我问服务员菜好了没,服务员有两种响应方式:
响应一:一直不回话,等到菜好了,才告诉我。(同步)
响应二:马上回答说,好了叫你。(异步)
到这里就会发现几种组合:
我一直不间断的询问服务员菜好了没,服务员等到菜好了,才告诉我。(同步阻塞)
或者我偶尔询问一下服务员(期间我在玩手机),服务员等到菜好了,才告诉我(同步非阻塞)
异步也是一样。
有人就会有疑问了:服务员在同步的时候不也是阻塞的吗?
因为关注方不一样,一开始关注的是我的调用者,产生疑问的时候其实是把服务员当成调用者,这样会才引起误会。
当服务员为调用者的时候,就有可能是阻塞的状态,但却是相对于厨师而言的。
符合我们开头所说的:
阻塞、非阻塞和同步、异步其实针对的对象是不一样的。
阻塞、非阻塞说的是调用者。
同步、异步说的是被调用者。
程序来源于生活,希望大家有自己不同的理解。
go手码的CI/CD部署系统,https://github.com/zhenorzz/goploy,star一下呗。