通俗系列之同步、异步、阻塞和非阻塞

前言

在日常的开发中,经常出现同步、异步、阻塞和非阻塞等概念。有些人搞不清楚什么代码是同步,什么代码是异步。有些人说我用异步了啊,为什么效率还是没提高呢?也许你是用异步了,但是可能是异步阻塞了。有些人一听说异步好,就不管三七二十一,所有方法全部改成异步,然后就会产生新的问题。归根结底还是对同步、异步、阻塞和非阻塞的概念不理解。

那究竟什么是同步、异步、阻塞和非阻塞呢?我决定尝试用比较通俗的例子举例来解释一下,于是便有了这篇文章。

同步

概念

什么是同步?同步就是一个任务的完成依赖于另外一个任务,只有被依赖的任务完成后,那么依赖的任务才能继续完成。

这是一种非常可靠的任务序列,要么都成功,要么都失败。

就和以前的瀑布式开发一样,你要做一个项目,一定要严格按照需求、分析、设计、编码、测试的步骤顺序执行,如果其中有一个问题卡住了,那么后边就无法继续,如果其中有一个环节是搞错了,那么这个项目也就可能死掉了。

同步又分同步阻塞和同步非阻塞,接下来将依次举例解释。

同步阻塞

同步阻塞就是调用方在等待另一个任务的结果返回来之前,什么事也没做,就是死等,直到返回,而且具体要等待的结果是用来干嘛的,如果不返回,是不知道的。

举例:

快到饭点了,老王很饿,来到了一家饭店,老王跟老板说来份蛋炒饭。

然后老板就是开始做,而老王就一直站在出饭的窗口等着,期间什么也没干,就是等着,直到老板把饭做好。

说明:

  • 数据调用方:老王 (主线程)

  • 数据持有方:饭店老板

  • 要获得的数据:蛋炒饭

  • 同步:老王等着老板把饭做好

  • 阻塞:老王在等着,期间什么也没做

这种调用方式很常见,这是以前普遍的方式,流水线式调用。

如果老王就这样等着,那么效率是很低的。

同步非阻塞

同步非阻塞就是,你在等一件事A的结果时,可以继续去干另外一件事B。但是你需要时不时的回来瞧一瞧A的结果是否返回了。

程序上通常都是用轮询去获取A事件是否完成并返回结果。

举例:

快到饭点了,老王很饿,来到了一家饭店,老王跟老板说来份蛋炒饭。

然后老板就是开始做,而老王呢,就跑到饭店的门头透透气,顺便刷刷微博,但是老王需要时不时的跑进去问问老板饭好了没有

说明:

  • 数据调用方:老王 (主线程)

  • 数据持有方:饭店老板

  • 要获得的数据:蛋炒饭

  • 同步:老王等着老板把饭做好

  • 非阻塞:老王等老板把饭做好,但是并不是站着死等,而是出门透透气,刷刷微博

这种调用方式,一般在同步操作中,中间需要处理一个比较耗时的操作时,通常是另外开辟一个线程去处理这个比较耗时的操作,但是后边需要自己去轮询另外一个线程的执行结果是否完成。

就比如上边,饭店老板做饭比较耗时,老王并没有一直等着,而是出门刷手机,但是饭有没有做好他需要时不时的跑进去问问,需要切换自己的位置。

异步

概念

异步就是调用方不需要一直等待被依赖的操作完成,可以继续干其他事情,当被依赖的操作完成后,会自动通知调用方。

调用异步操作时,被依赖的操作会直接返回一个任务或承诺给调用方,然后调用方会继续执行后边的操作。等被依赖的操作完成后,会通知调用方

日常生活中就很常见,比如:

领导给你安排一个任务,可能会说:小明你把xx项目的方案写一下,写完之后xx项目的相关人员一起去会议室开个会。小明肯定不能立即把方案写完,此时就会回答领导,“好的领导”。然后领导继续干自己的事,小明就去写方案,写完之后小明去通知领导,然后领导拿到方案后通知相关人员一起开会。

异步阻塞

异步阻塞就是虽然被依赖项完成时会通知调用方,但是调用方并没有继续去干其他事,而是依旧继续在那等着。

举例:

快到饭点了,老王很饿,来到了一家饭店,老王跟老板说来份蛋炒饭。

老板在点菜机上下了单,并给了老王一个号,告诉老王等饭做好后,会叫号通知的。

虽然会通知,但是老王很饿很着急,依旧站在出饭窗口等着。

说明:

  • 数据调用方:老王 (主线程)

  • 数据持有方:饭店老板

  • 要获得的数据:蛋炒饭

  • 异步:饭做好了会叫号通知的。

  • 阻塞:虽然会通知,但是老王依旧站那等着饭做好,期间什么也没做。

目前,现实社会中大部分场景都有了叫号功能,不需要一直排队等着。但是也免不了有个别人比较着急,即便是会叫号也一直站旁边等着。

异步非阻塞

异步非阻塞就是被依赖项完成时会通知调用方,调用方无需等待被依赖项,可以继续干其他跟依赖项结果无关的事。

举例:

快到饭点了,老王很饿,来到了一家饭店,老王跟老板说来份蛋炒饭。

老板在点菜机上下了单,并给了老王一个单子,单子上是5号,告诉老王饭做好后,会叫这个号通知的。

然后,老王拿着号找了个位置,刷起了新闻,期间还出门打了个电话,处理了一些工作上的事。突然老王听到叫号机通知5号的饭做好了,然后老王去窗口拿自己的饭。

说明:

  • 数据调用方:老王 (主线程)

  • 数据持有方:饭店老板

  • 要获得的数据:蛋炒饭

  • 异步:饭做好了会叫号通知的。

  • 非阻塞:因为饭做好后会叫号,所以老王并没有一直站那等着,期间找了个位置刷起了新闻,还出去接了个电话

这种效率是最高的,你做你的饭,我可以继续干不依赖于饭的事。你做好饭了叫我就行。

异步在目前的前后端开发中都挺常见的。

前端中通常会返回一个Promise(承诺)对象,.NET后端通常返回一个Task(任务),两个其实是一个意思。接下来以前端来举例例如:

//AService.js 有两个方法,一个是获取数据getData(),一个是做一些耗时操作doSomething()
async getData(){return await GetMyData()//该方法需要查数据比较耗时
}
//该方法就写一些日志
async doSomething(){await writeLog()
}//B.vue页面
inint (){// 1 异步执行某个操作doSomething() // 2 异步获取数据,然后对数据做xxx处理。代码的阅读和现实的语义是一样的。getData().then(res => {//可以针对res做相应的处理})//3//... 不依赖于1、2的同步操作。
}//上边doSomething()和getData().then()都会立即返回一个Promise(承诺),承诺会完成.

上边1、2都是瞬间完成的,返回了一个Promise(承诺)。既然叫承诺,那就很好理解了,我承诺会完成,但不是立即完成。

就比如开会的时候领导说,接下来安排一下任务:

  1. 张三,你把A项目的方案写一下,写完跟我讲一下,我们一起开会讨论一下,张三说”好的“。此时张三只是给领导了一个承诺,并没有立即完成。(异步

  2. 李四,你等会把B项目部署一下,看看运行效果。李四说”好的“。此时李四也是一个承诺,并没有完成B项目部署。(异步

  3. 然后领导将会议记录和任务安排发了给大家。(同步)

上边的3并不依赖于1、2,领导不需要非要等张三把A项目方案写好,也不需要等李四把B项目部署好,再将会议记录和任务安排发给大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的matplotlib库内的函数_如何在matplotlib中找到函数下面的区域?

我是python和matplotlib库的新手,我试图在绘图中得到函数行下方的区域。我有一个变量a&b,它在我的绘图中移动一个矩形。我也许可以使用原始数学来解决这个问题,但我想知道是否有一种更简单的方法来实现我正在尝试使用matp…

局域网一点通之组网、管网、用网1000问

(51cto.com)局域网一点通之组网、管网、用网1000问转载于:https://blog.51cto.com/laowu2517/241359

【直观详解】支持向量机SVM

【阅读时间】13min - 19min【内容简介】详解解读什么是支持向量机,如何解支持向量以及涉及的拉普拉斯乘子法,还有核方法的解读。1什么是支持向量机-SVM支持向量机-SVM(Support Vector Machine)从本质来说是一种:用一条线(方程&…

C# 打印PDF文档的10种方法

操作PDF文档时,打印是常见的需求之一。针对不同的打印需求,可分多种情况来进行,如设置静默打印、指定打印页码范围和打印纸张大小、双面打印、黑白打印等等。经过测试,下面将对常见的几种PDF打印需求做一些归纳总结,这…

遗传算法经典实例代码_经典算法研究系列 之 深入浅出遗传算法

关注数学,关注AI,关注我们公众号ID:Math-AI经典算法研究系列遗传算法1初探遗传算法Ok,先看维基百科对遗传算法所给的解释:遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是…

java buffalo_随你怎么玩!Buffalo 网络硬盘新潮流

现代时尚的办公环境是怎样的?ADSL、无线网络、笔记本、还有咖啡,惬意地被沙发包裹起来,自由自在地网上冲浪……;当然仅仅有这些还是不够,我们需要视频会议、需要网络下载、甚至打印、扫描,还有需要随时随地…

关于Virtual-Hosting的理解

最近在Apache上架设Virtual-hosts 时,发现启动了httpd-vhost.conf 之后,再用IP 访问Main Server(httpd.conf)的设置就失效了。比如说原来 在 htdocs/下有一些应用程序,就不能够再访问到。用IP所有的请求就被转发到了&…

.NET gRPC核心功能初体验

gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。由Google开源,目前是一个Cloud Native Computing Foundation(CNCF)孵化项目。其功能包括:•双向流•强大的二进制序列化•可插拔的身份…

为什么我怎么也理解不了波粒二象性,是因为智商不够吗?

大家好,各位观众。如果你们之前不能完全理解波粒二象性(现象本身,或者这个概念的内涵和外延)。不用担心,我认为十有八九不是智商问题:量子物理的内容有太多“反常识”了。很多时候,是我们的脑袋…

python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射

1. 函数的作用域1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置x1 #全局作用def f1(): #整个f1函数是定义阶段deff2():print(x)returnf2deffoo(func):x3func()#func()调用阶段x200 #这样定义x又变成全局了foo(f1()) #执行foo(…

设备间的连线图例

转载于:https://blog.51cto.com/51fashion/243017

化学版2048,你玩过吗?内含游戏链接

今天来给大家推荐一款游戏——Na(钠),也可以叫它化学版2048。首先2048大家都不陌生,曾经火爆一时的小游戏,于14年由年仅19岁的意大利程序员加布里勒希鲁尼(Gabriele Cirulli)开发出来。2048游戏…

ajax jquery php_基于Ajax jquery的使用php登录

我使用基于PHP的登录表单与Ajax和jQuery以下是我的登录表单Please Sign InLoginRegister和我的阿贾克斯代码登录$("button#submit").click(function () {if ($("#username").val() "" || $("#password").val() "")$("…

sqlsession.selectlist 会返回null么_StackOverflow经典问题:代码中如何去掉烦人的“!=nullquot;判空语句...

推荐阅读:程序员引路人:腾讯T4曰“面试不仅仅是技术过硬就可以了,你还需要懂得这些”​zhuanlan.zhihu.com问题为了避免空指针调用,我们经常会看到这样的语句if (someobject ! null) { someobject.doCalc();}最终,项…

如何在 ASP.Net Core 中使用 Configuration Provider

ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配置还支持 层级方式&…

GdiPlus[30]: IGPPen: 线帽

StartCap 和 EndCap 属性分别用来读写两段的线帽, 测试图:StartCap 和 EndCap 测试代码:uses GdiPlus;procedure TForm1.FormPaint(Sender: TObject); constCapArr: array[0..8] of Byte (0, 1, 2, 3, $10, $11, $12, $13, $14); varGraphics: IGPGraphics;Pen: IGPPen;Pt1,Pt…

你知道怎么样排序才能做到多快好省?

小智最近迷上了计算机算法,今天过来给大家讲讲排序算法。准备讲排序算法之前,我们还是要先回顾一下排序这个概念。排序是一门古老的科学。排序问题,用数学的方式可以表达如下问题输入:给定n个数,a1, a2, a3, ..., an…

php 数据导出到excel文件,PHP导出数据到excel文件

下面介绍一个很另类的php导出数据到xls文件的方法,用到的函数有pack,iconv//上面三个自定义函数很重要,大家自行揣摩function xlsBOF() {echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);}function xlsEOF() {echo pack("ss"…

C# 使用 Index 和 Range 简化集合操作

C# 使用 Index 和 Range 简化集合操作Intro有的语言数组的索引值是支持负数的,表示从后向前索引,比如:arr[-1]从 C# 8 开始,C# 支持了数组的反向 Index,和 Range 操作,反向 Index 类似于其他语言中的负索引…

python 服务端框架_GitHub - edisonlz/fastor: Python服务端开发框架-极易上手,超出你的想象!...

欢迎使用Python 服务端开发框架 FastorFastor是一款专为Python 打造的API与后端管理系统,通过精心的设计与技术实现,集成了大部分稳定开发组件,memcache , redis,tornado,django,mysql 等。特点…