若是第二次看到个人文章,欢迎「文末」扫码订阅我我的的公众号(跨界架构师)哟~
每周五早8点 按时送达到公众号。固然了,也会时不时加个餐~
前面一篇文章中,Z哥和你聊了「异步」的意义,以及如何运用它。错过这篇文章的能够先去看一下再来(分布式系统关注点——深刻浅出「异步」)。html
其实我知道有很多小伙伴容易将「异步」和「非阻塞」搞混。脑海里印象多是这样的:异步=非阻塞,同步=阻塞?linux
其实并非如此,Z哥我此次就想来帮你搞清楚这个问题。程序员
你平时编写的代码中,大部分的「同步」调用,本质上都是「阻塞」的。可是「同步」调用也能够作到「非阻塞」的效果。api
仍是拿咱们上一篇中提到的排队买奶茶这个例子,看看为何说是「同步」+「阻塞」。缓存
文章里「同步」的例子说的是,你排队买奶茶,点完单继续“占着坑”,不让后面的人点单,等里面的店员作好奶茶,你拿走了后面的才能点单。这个其实就是「同步」+「阻塞」,「阻塞」体如今哪?微信
由于这个时候你一直“占着坑”,生怕后面的人先点单,致使店员给他先作。因此,这个时候你就死死的盯着里面,这个就是「阻塞」,由于你除了盯着其它啥都干不了。网络
怎么让「同步」也能不阻塞呢?架构
就是你虽然仍是排着队“占着坑”,可是人没闲着,低头玩玩手机,时不时的问里面“个人奶茶作好了没?个人奶茶作好了没?”。这个就是「非阻塞」,由于你两次询问之间会间隔一段时间,能够在这个时候作其它的事情。本质上是经过将本来的一个「大同步」拆成多个「小同步」达到「非阻塞」的效果。框架
上图中,几回阻塞之间空白区域就能够用于作其它事,因此是「非阻塞」的。异步
上一篇文章中的「异步」例子就是一个「非阻塞」的例子,咱们来看看为何。
奶茶店分了点单区和取餐区以后,作好的饮料就只能从取餐区拿,也意味着接待你进行点单的人并非实际作奶茶的人。这个时候你会拿到一张取餐号,而后老老实实的去取餐区等着,而不是“占着xx不xx”。
若是你很着急要拿到奶茶,不断的问里面“个人奶茶作好了没?个人奶茶作好了没?”,那这个仍是「同步」+「非阻塞」的模式。由于这个过程没有产生「回调」,是你在不断的主动发起“请求”。
但若是你不着急,就在边上开一局吃鸡,等着里面作好了叫号,到你号码了再去拿。这就是「异步」+「非阻塞」。由于这个事情是对方(里面的店员)触发完成的,这就是「回调」,是对你以前的“点单”请求进行的响应。一来一回完成一个完整的交互。
到这可能你会说,那异步不仍是自然「非阻塞」的么?No、No、No。
阻塞不阻塞是你本身决定的,你能够阻塞啊。好比,你等的“回调”时候发现没带手机,玩不了吃鸡,那只能傻傻的在那等着,啥也干不了。如此,这个过程虽然仍是「异步」的,但对你来讲就是「阻塞」的。
「同步」+「阻塞」。这种最多见,平时写的大部分代码都是如此,就很少说了。
其实你仔细想一下就会发现,不少知名的框架,都是「同步」+「非阻塞」的,为何呢?由于你能够继续像「同步」同样编写代码,可是能够享受到相似「异步」所能带来的更好的性能,何乐而不为?
好比大名鼎鼎的linux中的io复用模型poll/select/epoll,本质上都是「同步」+「非阻塞」的。还有知名网络通讯框架Netty。
咱们在设计对外的api的时候也可使用这种模式,下降一些耗时接口调用所产生的影响。这个阮一峰老师已经写的很是清楚了,我就直接贴个连接:http://www.ruanyifeng.com/blo...。
之因此你们会有错觉,认为「异步」=「非阻塞」,其实也不是没有道理。为何呢?由于我在脑海中搜寻来一番,的确没想到有什么知名的框架/设计是使用「异步」+「阻塞」来实现的。若是哪位小伙伴有补充,能够在评论区留言告诉你们。
「异步」+「非阻塞」就多了。任何你看到callback关键字的框架都是。
好了,咱们一块儿总结一下。
此次呢,Z哥先经过同步/异步、阻塞/非阻塞之间造成的4种组合形式,聊了下它们究竟是怎么回事。
而后和你聊了一下工做中哪里能看到它们的存在,以及在一些典型场景下适合用哪种模式。
但愿对你有所启发。
最后送你一个记住这4个概念的最好办法。
若是仍是记不住,那就记住同步/异步表示“过程”,阻塞/非阻塞表示在这个过程当中的“状态”。至于这句话是怎么来的,回来看这篇文章就行。
相关文章:
做者:Zachary
出处:https://www.cnblogs.com/Zacha...
若是你喜欢这篇文章,能够点一下文末的「赞」。
这样能够给我一点反馈。: )
谢谢你的举手之劳。
▶关于做者:张帆(Zachary, 我的微信号:Zachary-ZF)。坚持用心打磨每一篇高质量原创。欢迎 扫描下方的二维码~。
按期发表原创内容: 架构设计丨分布式系统丨产品丨运营丨一些思考。若是你是初级程序员,想提高但不知道如何下手。又或者作程序员多年,陷入了一些瓶颈想拓宽一下视野。欢迎关注个人公众号「跨界架构师」,回复「技术」,送你一份我长期收集和整理的思惟导图。
若是你是运营,面对不断变化的市场一筹莫展。又或者想了解主流的运营策略,以丰富本身的“仓库”。欢迎关注个人公众号「跨界架构师」,回复「运营」,送你一份我长期收集和整理的思惟导图。