如果第二次看到我的文章,欢迎右侧扫码订阅我哟~  ?

每周五早8点 按时送达。当然了,也会时不时加个餐~

前面一篇文章中,Z哥和你聊了「异步」的意义,以及如何运用它。错过这篇文章的可以先去看一下再来(分布式系统关注点——深入浅出「异步」)。
其实我知道有不少小伙伴容易将「异步」和「非阻塞」搞混。脑海里印象可能是这样的:异步=非阻塞,同步=阻塞?
其实并不是如此,Z哥我这次就想来帮你搞清楚这个问题。

同步与阻塞/非阻塞

你平时编写的代码中,大部分的「同步」调用,本质上都是「阻塞」的。但是「同步」调用也可以做到「非阻塞」的效果。
还是拿我们上一篇中提到的排队买奶茶这个例子,看看为什么说是「同步」+「阻塞」。
文章里「同步」的例子说的是,你排队买奶茶,点完单继续“占着坑”,不让后面的人点单,等里面的店员做好奶茶,你拿走了后面的才能点单。这个其实就是「同步」+「阻塞」,「阻塞」体现在哪?

因为这个时候你一直“占着坑”,生怕后面的人先点单,导致店员给他先做。所以,这个时候你就死死的盯着里面,这个就是「阻塞」,因为你除了盯着其它啥都干不了。
怎么让「同步」也能不阻塞呢?
就是你虽然还是排着队“占着坑”,但是人没闲着,低头玩玩手机,时不时的问里面“我的奶茶做好了没?我的奶茶做好了没?”。这个就是「非阻塞」,因为你两次询问之间会间隔一段时间,可以在这个时候做其它的事情。本质上是通过将原本的一个「大同步」拆成多个「小同步」达到「非阻塞」的效果。

上图中,几次阻塞之间空白区域就可以用于做其它事,所以是「非阻塞」的。

异步与阻塞/非阻塞

上一篇文章中的「异步」例子就是一个「非阻塞」的例子,我们来看看为什么。
奶茶店分了点单区和取餐区之后,做好的饮料就只能从取餐区拿,也意味着接待你进行点单的人并不是实际做奶茶的人。这个时候你会拿到一张取餐号,然后老老实实的去取餐区等着,而不是“占着xx不xx”。
如果你很着急要拿到奶茶,不断的问里面“我的奶茶做好了没?我的奶茶做好了没?”,那这个还是「同步」+「非阻塞」的模式。因为这个过程没有产生「回调」,是你在不断的主动发起“请求”
但如果你不着急,就在边上开一局吃鸡,等着里面做好了叫号,到你号码了再去拿。这就是「异步」+「非阻塞」。因为这个事情是对方(里面的店员)触发完成的,这就是「回调」,是对你之前的“点单”请求进行的响应。一来一回完成一个完整的交互。

到这可能你会说,那异步不还是天然「非阻塞」的么?No、No、No。
阻塞不阻塞是你自己决定的,你可以阻塞啊。比如,你等的“回调”时候发现没带手机,玩不了吃鸡,那只能傻傻的在那等着,啥也干不了。如此,这个过程虽然还是「异步」的,但对你来说就是「阻塞」的。

工作中的同步/异步&阻塞/非阻塞

「同步」+「阻塞」。这种最常见,平时写的大部分代码都是如此,就不多说了。
其实你仔细想一下就会发现,很多知名的框架,都是「同步」+「非阻塞」的,为什么呢?因为你可以继续像「同步」一样编写代码,但是可以享受到类似「异步」所能带来的更好的性能,何乐而不为?
比如大名鼎鼎的linux中的io复用模型poll/select/epoll,本质上都是「同步」+「非阻塞」的。还有知名网络通信框架Netty。
我们在设计对外的api的时候也可以使用这种模式,降低一些耗时接口调用所产生的影响。这个阮一峰老师已经写的非常清楚了,我就直接贴个链接:http://www.ruanyifeng.com/blog/2018/12/async-api-design.html。
之所以大家会有错觉,认为「异步」=「非阻塞」,其实也不是没有道理。为什么呢?因为我在脑海中搜寻来一番,的确没想到有什么知名的框架/设计是使用「异步」+「阻塞」来实现的。如果哪位小伙伴有补充,可以在评论区留言告诉大家。
「异步」+「非阻塞」就多了。任何你看到callback关键字的框架都是。

总结

好了,我们一起总结一下。
这次呢,Z哥先通过同步/异步、阻塞/非阻塞之间形成的4种组合形式,聊了下它们到底是怎么回事。
然后和你聊了一下工作中哪里能看到它们的存在,以及在一些典型场景下适合用哪一种模式。
希望对你有所启发。
最后送你一个记住这4个概念的最好办法。
  • 同步阻塞:你干吧,我看着你干
  • 同步非阻塞:你干吧,我每隔5分钟来看看
  • 异步阻塞:你干吧,好了告诉我,我等着
  • 异步非阻塞:你干吧,好了告诉我,我先去忙别的了
如果还是记不住,那就记住同步/异步表示“过程”,阻塞/非阻塞表示在这个过程中的“状态”。至于这句话是怎么来的,回来看这篇文章就行。
相关文章:
  • 分布式系统关注点——深入浅出「异步」
  • 分布式系统关注点——360°全方位解读「缓存」

作者:Zachary

出处:https://www.cnblogs.com/Zachary-Fan/p/blocknonblock.html

如果你喜欢这篇文章,可以点一下右下角的「推荐」。

这样可以给我一点反馈。: )

谢谢你的举手之劳。

既然看到这了,送我一个「赞同」吧,支持我的创作。

想更进一步和我一起玩耍,欢迎「搜索微信公号:跨界架构师」或者在「右侧扫描」。

内容包括:架构设计丨分布式系统丨产品丨运营丨个人深度思考。

转载于:https://www.cnblogs.com/Zachary-Fan/p/blocknonblock.html

分布式系统关注点(20)——阻塞与非阻塞有什么区别?相关推荐

  1. 【NIO】阻塞与非阻塞

    "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...

  2. 理解同步异步、阻塞与非阻塞

    "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...

  3. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  4. 同步、异步、阻塞、非阻塞、BIO、NIO、AIO

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  5. python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)

    本文主要向大家介绍了Python语言之python并发原理(阻塞.非阻塞.epoll),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在Linux系统中 01 阻塞服务端 特征: ...

  6. 32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系

    问题 1:阻塞.非阻塞 I/O 与同步.异步 I/O 的区别和联系 在文件系统的工作原理篇中,介绍了阻塞.非阻塞 I/O 以及同步.异步 I/O 的含义,这里我们再简单回顾一下. 首先我们来看阻塞和非 ...

  7. linux函数的阻塞与非阻塞IO及错误处理

    linux函数的阻塞与非阻塞IO及错误处理 1.阻塞是指进程等待某一个事件的发生而处于等待状态不往下执行,如果等待的事件发生了则会继续执行该进程.调用系统阻塞函数可能会导致进程阻塞进入睡眠状态. 2. ...

  8. Socket阻塞与非阻塞,同步与异步、I/O模型

    [原文链接] 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:       所谓同步,就是在发出一 ...

  9. Linux 阻塞和非阻塞IO 实验

    目录 阻塞和非阻塞IO 阻塞和非阻塞简介 等待队列 轮询 Linux 驱动下的poll 操作函数 阻塞IO 实验 硬件原理图分析 实验程序编写 运行测试 非阻塞IO 实验 硬件原理图分析 实验程序编写 ...

  10. 聊聊同步、异步、阻塞与非阻塞

    近来遇到了一些常见的概念,尤其是网络编程方面的概念,如:阻塞.非阻塞.异步I/O等等,对于这些概念自己也没有太清晰的认识,只是很模糊的概念,说了解吧也了解,但是要让自己准确的描述概念方面的具体细节,却 ...

最新文章

  1. Cacti/Nagios监控系统应用场景
  2. linux c 实现 http get post 请求
  3. 学习笔记(27):Python网络编程并发编程-GIL与多线程
  4. Java命令学习系列(一)——Jps
  5. lora信号测试小助手_LoRa是如何通过CAD来实现唤醒的
  6. 开源自动化配置管理工具Puppet入门教程
  7. WMI 脚本入门:第二部分 (MSDN)
  8. Java 学习 day09
  9. MySQL重要但容易被忽略_MySQL自定义函数存储过程
  10. 50岁的哆啦A梦“撞”上63岁的卡西欧,阿里云数据中台告诉你火花能有多大
  11. mysql锁的级别_mysql 锁和各锁级别
  12. jpg照片太大怎么压缩?教你简单快速完成jpg压缩
  13. MIMO天线市场深度研究分析报告
  14. 动态随机存储器的刷新
  15. 求饶不经过原点的旋转轴的旋转矩阵
  16. errorreporting php,php-phpin的error_reporting 22527中的22527是什么
  17. wp7编程环境配置(包含xp下安装)
  18. Andersen Global在南非拓展业务
  19. c语言滚动字幕的原理编程,c#中通过Graphics.DrawString实现滚动字幕的原理和代码实例...
  20. linux运行QQ,微信,企业微信 (非deepin)

热门文章

  1. 和DOM一起的日子:检测与预防DOM跨站脚本攻击
  2. 更改TFS项目中的SharePoint网站端口
  3. ES6——函数参数默认值
  4. ★LeetCode(182)——查找重复的电子邮箱(MySQL)
  5. ★LeetCode(942)——增减字符串匹配(JavaScript)
  6. 前端根据设计图精确开发 (攻具)
  7. 【零基础学Java】—final关键字与四种用法(二十九)
  8. Visual Studio Code是什么
  9. 有没有用逆向算法恢复马赛克的可能性?
  10. 小孩天天不愿意去幼儿园怎么办?