同步异步以及阻塞和非阻塞的区别
一、同步与异步的区别:
同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。
异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,一次它是一个不可靠的服务序列。
消息通知中的同步和异步
同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行;
异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。在调用结束之后,通过消息回调来通知调用者是否调用成功。
调用者获取异步调用服务结果的两种方式:一种是主动去轮训查询异步回调的结果;一种调用依赖服务时传入一个callback方法或者回调地址,依赖服务完成之后去调用callback通知调用者;一般情况,这两种方式都要支持才是一种良好的异步回调设计方法。
场景比喻
小明去买奶茶,可能会有两种方式
1、小明点单交钱,然后等着取奶茶;
2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;
第一种方式就是同步,就等着奶茶妹做好奶茶,奶茶做好之后,小明拿到奶茶才算完成整个任务
第二种方式就是异步,奶茶妹给了小明一个小票,小明就算完成了。至于最后奶茶做好没有,反正奶茶妹会告诉小明的,那是后面的事情了。
所以: 同步与异步着重点在消息通知的方式,也就是调用结果通知的方式。结合场景就是,拿到奶茶的方式。
二、阻塞与非阻塞的区别
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。
非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。
阻塞调用和同步调用不同的。对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。
同步、异步&阻塞、非阻塞
(a) 如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
(b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;
所以同步的实现方式会有两种:同步阻塞、同步非阻塞;同理,异步也会有两种实现:异步阻塞、异步非阻塞;
场景比喻
还是小明去买奶茶,可能会有两种方式:
1、小明点单交钱,然后等着取奶茶;
——同步阻塞:小明在等着取奶茶的时候呢,啥都不干,就等着;小明等奶茶的行为就叫做阻塞,小明在等奶茶的时候,阻塞了!而这种方式又叫做同步阻塞。
——同步非阻塞:小明在等着取奶茶的时候呢,翻出手机,一会翻翻微信朋友圈,一会瞅瞅奶茶妹有没有做好奶茶;小明这种行为就叫做非阻塞,因为没有阻塞在等奶茶这件事情上。而这种方式又叫做同步非阻塞。
2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取
——异步阻塞:奶茶妹给了小明一个小票,然后小明还是傻等着;小明这种拿到票还傻等着的行为,就叫阻塞。而这种行为,又叫做异步阻塞!这种最傻了。
——异步非阻塞:奶茶妹给了小明一个小票,然后小明翻出手机一直刷朋友圈,过了一会儿奶茶妹说小明你的奶茶好了,过来拿,小明才放下手机去拿奶茶。这种方式就叫做非阻塞,又叫着异步非阻塞!
所以:阻塞与非阻塞的区别重点在于当前线程等待消息返回的行为。换成场景就是,小明等奶茶的行为。
总结:
1、同步阻塞:小明啥都不干等奶茶。
2、同步非阻塞:小明一边玩手机一边等奶茶。
3、异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
4、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了
同步异步以及阻塞和非阻塞的区别相关推荐
- 同步与异步,阻塞与非阻塞的区别
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清
为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...
- 那些年让你迷惑的阻塞、非阻塞、异步、同步
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清 ...
- 这次,让我们捋清:同步、异步、阻塞、非阻塞
继上一篇说透I/O模型后,我们来谈谈网络 I/O 经常会伴随的几个容易令人混淆的概念:同步.异步.阻塞.非阻塞的区别. 这篇写完之后铺垫就差不多了,之后就正式开始 Netty 深度剖析了,敬请期待,嘻 ...
- 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
承接上文的操作系统,关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 ...
- 并发、并行、串行、同步、异步、阻塞、非阻塞
并发.并行.串行.同步.异步.阻塞.非阻塞 实际上同步与异步是针对应用程序与内核的交互而言的. 同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是 ...
- 理解同步异步、阻塞与非阻塞
"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...
- linux socket 阻塞与非阻塞,同步与异步
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在c端发出 ...
- linux 同步与异步--阻塞与非阻塞型I/O
同步阻塞IO 在这个模型中,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了).ke ...
- python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO
Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...
最新文章
- tzselect 设置时间
- db2 迁移mysql,mysql 迁移 db2
- 解析mysqlbinlog日志_mysqlbinlog日志分析 日志挖掘 违规操作
- 【Python】Matplotlib使用字符串代替变量绘制散点图
- python变量命名规则思维导图_python基础知识点思维导图
- NVMe驱动解析-DMA传输
- php扩展exif模块,Centos+PHP模块+exif扩展 (第三方模块)
- catia二次开发c语言,CATIA二次开发1_VB语言基础语法
- 浅谈常见浏览器缓存方法(前端缓存)
- 基于opencv的图像拼接
- 鸿蒙系统官网电脑版,华为鸿蒙pc系统
- 导出pdf文件时加图片水印
- Powershell运行脚本异常:无法加载文件...因为在此系统上禁止运行脚本
- GBase 8c产品家族及功能简介
- UG NX二次开发(C#)-装配-添加组件AddComponent
- 语音识别第4讲:语音特征参数MFCC
- python3.7爬虫
- 如何掌控自己的时间和生活
- 怎么把It驻场开发推广出去
- 小事认真,大事才会卓越
热门文章
- java类里面再定一个类_java类的里面可以再定义一个类吗 java里可不可以在一个...
- java计算机毕业设计婚恋网站源码+mysql数据库+系统+lw文档+部署
- 1. linux下gradle环境安装
- 国务院通知明确2008年节假日具体安排
- c语言桌游,那些超受欢迎的桌游——你玩过几个?(一)
- 纯干货!77个Python常用函数汇总,赶紧收藏!
- win10无法检测java_win10下配置JAVA环境变量(以及错误: 找不到或无法加载主类的处理方法)...
- docker inspect命令查看镜像详细信息
- 【组合数学】第二类斯特林数
- Dinic Algorithm