010.理解异步性

异步消息传递是响应式系统的一个关键特性。但到底是什么异步性,为什么它对响应式应用程序如此重要?我们的人生注定在许多异步任务中。你可能没有意识到,但你的日常活动如果它们本质上不是异步的,那就太烦人了。要理解什么是异步,首先需要理解非异步执行或同步执行。

同步执行意味着您必须等待一个任务完成,然后才能继续执行下一个任务。同步执行的一个现实例子发生在快餐店:你走向柜台的工作人员,在店员等待的时候决定要点什么,点你的食物,一直等到饭菜准备好。店员等着你把钱交出来,然后给你食物。只有这样,你才能继续下一个任务,去你的桌子吃饭。这个序列如图1.14所示。
在这里插入图片描述
图1.14同步点餐,每一步都必须完成后才能进入下一步

这种类型的序列感觉像是在浪费时间(或者,更好地说,是在浪费资源),所以想象一下当你为应用程序做同样的事情时,你的应用程序会有什么感觉。下一节将对此进行演示。

一、这都是关于资源的使用
想象一下你的生活会是什么样子,如果在你做其它事情之前,你必须等待每一个操作完成,此时,那会有多少资源处于等待。同样的问题也与计算机科学相关:

writeResult = LongDiskWrite();
response = LongWebRequest();
entities = LongDatabaseQuery();

在这个同步代码片段中,LongDatabaseQuery将不会开始执行,直到LongWebRequest和LongDiskWrite完成。在执行每个方法的过程中,调用线程被阻塞,它所拥有的资源实际上被浪费了,不能用于服务其他请求或处理其他事件。如果这种情况发生在UI线程上,那么应用程序将看起来冻结,直到执行完成。如果这种情况发生在服务器应用程序上,那么在某个时刻,您可能会用完可用线程,并且请求将开始被拒绝。在这两种情况下,应用程序都停止响应。

运行前面的代码片段所需的总时间如下:

total_time = LongDiskWritetime + LongWebRequesttime + LongDatabaseQuerytime

总完成时间是其组成部分的完成时间之和。如果您可以在不等待上一个操作完成的情况下启动一个操作,则可以更好地使用您的资源。这就是异步执行的作用。

异步执行意味着一个操作已经启动,但它的执行是在后台进行的,并且调用者没有被阻止。相反,当操作完成时,会通知调用方。在这段时间里,调用者可以继续做有用的工作。

在点餐示例中,异步方法类似于坐在桌子旁由服务员服务。首先,你坐在桌子旁,服务员来递给你菜单,然后离开。当你决定点什么时,服务员仍然可以为其他顾客服务。当你决定了要什么餐后,服务员会回来帮你点餐。在准备食物的同时,你可以自由聊天、使用手机或欣赏风景。你没有被阻拦(服务员也没有)。当食物准备好后,服务员把它端到你的桌子上,然后回去为其他顾客服务,直到你要求结账并付款。

该模型是异步的:任务并发执行,执行的时间与请求的时间不同。这样,资源(例如
服务员)可以自由处理更多的要求。

异步执行发生在哪里?
在计算机程序中,我们可以区分两种类型的异步操作:基于cpu的和基于I/ o的。
在基于cpu的操作中,异步代码在另一个线程上运行当另一个线程的执行结束时返回结果。
在基于I/O的操作中,操作是在I/O设备(如硬盘)上进行的驱动器或网络。在网络上,向另一台机器发出请求(通过使用TCP)或UDP或其他网络协议),以及机器上的操作系统何时收到信号由网络硬件发出的中断结果返回,则操作将完成。
在这两种情况下,调用线程都可以自由地执行其他任务并处理其他任务请求和事件。

异步运行代码的方法不止一种,这取决于所使用的语言。附录A展示了在c#中实现这一点的方法,并深入研究了每个比特和字节。现在,让我们看一个使用。net future实现的异步工作的例子——Task类:

上述代码片段的异步版本如下所示:

taskA = LongDiskWriteAsync();
taskB = LongWebRequestAsync();
taskC = LongDatabaseQueryAsync();
Task.WaitAll(taskA, taskB, taskC);

在这个版本中,每个方法都返回Task<T>。这个类表示一个正在后台执行的操作。当调用每个方法时,调用线程不会被阻塞,并且该方法会立即返回。然后在上一个方法仍在执行时调用下一个方法。当所有方法都被调用时,您可以使用Task来等待它们的完成。WaitAll方法,该方法获取任务和块的集合,直到所有任务和块都完成为止。另一种写法如下:

taskA = LongDiskWriteAsync();
taskB = LongWebRequestAsync();
taskC = LongDatabaseQueryAsync();
taskA.Wait();
taskB.Wait(); 
taskC.Wait();

这样,你会得到同样的结果;您等待每个任务完成(当它们仍在后台运行时)。如果在调用Wait方法时任务已经完成,它将立即返回。运行代码片段的异步版本所需的总时间如下:
total_time = MAX(LongDiskWritetime, LongWebRequesttime, LongDatabaseQuerytime)
因为所有方法都是并发运行的(甚至可能是并行运行的),所以运行代码所需的时间将是最长操作的时间。

二、Rx与异步编程

异步执行并不局限于仅通过使用Task<t>来处理。在附录A中,您将了解中使用的其他模式.NET Framework提供异步执行。

回顾IObservable,即时变变量的Rx表示,您可以使用它来表示任何异步模式,因此当异步执行完成(成功或出现错误)时,执行链将运行,并评估依赖关系。Rx提供了将各种类型的异步执行(如Task<T>)转换为IObservable<T>的方法。

例如,在Shoppy应用程序中,不仅当您的位置发生变化时,而且当您的连接状态变为在线时,您都希望获得新的折扣——例如,如果您的手机短时间失去信号,然后重新连接。对Shoppy web服务的调用是以异步方式完成的,当它完成时,您希望更新视图以显示新项目:

IObservable<Connectivity> myConnectivity=...
IObservable<IEnumerable<Discount>> newDiscounts =from connectivity in myConnectivitywhere connectivity == Connectivity.Onlinefrom discounts in GetDiscounts() //GetDiscounts返回一个任务,该任务已隐式转换为可观察项。select discounts;newDiscounts.Subscribe(discounts => RefreshView(discounts));//RefreshView显示折扣。
private Task<IEnumerable<Discount>> GetDiscounts()
{//Sends request to the server and receives the collection of discounts
}

在本例中,您将对myConnectivity可观察到的连接更改做出反应。每次连接发生变化时,您都会检查是否是因为您处于联机状态,如果是,则调用异步Get Discounts方法。方法执行完成后,您可以选择返回的结果。这个结果将被推送给从您的代码中创建的新折扣可观察的观察者。

——未完待续

译者:重庆教主(QQ23611316) 2024.05.14

网站:WPF中文网 wpfsoft.com

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

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

相关文章

Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

云动态摘要 2024-05-15

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

一本书打通SLAM在智能汽车/自动驾驶领域应用

自动驾驶技术已成为当今数字化时代汽车行业的热点话题之一。随着技术的不断成熟&#xff0c;越来越多的车辆采用激光SLAM&#xff08;即时定位与地图构建&#xff09;和视觉SLAM技术&#xff0c;实现更高层次的智能网联汽车。SLAM技术在智能网联汽车中的应用是非常重要的&#…

【算法】NOIP2003神经网络

题目描述 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&#xff0c;兰兰同学在自学了一本神经网络的…

守护长者安全,平安养老险携手福海街道开展防灾减灾活动

在构建和谐社会、倡导人文关怀的当下&#xff0c;平安养老险以高度的社会责任感和深厚的人文情怀&#xff0c;持续关注老年人的健康与安全。在今年“5.12防灾减灾日”来临之际&#xff0c;平安养老险深圳分公司积极响应倡议&#xff0c;于5月10日携手福海街道举办了在福海街道举…

4种现象表明你的血糖控制良好!

如果你出现以下4种现象&#xff0c;恭喜你&#xff0c;说明你的血糖控制的不错&#xff0c;需要继续坚持。 1.饥饿感减少&#xff0c;我们的脏腑能够吸收血液中的糖分了&#xff0c;就用不着饿了。&#xff0c;血液中的糖能够得到充分的利用&#xff0c;血糖自然降下去。 2.体…

Leecode热题100---11:盛最多水的容器

题目&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾…

数据结构学习/复习14--归并排序的递归与循环实现/计数排序

一、归并排序 1.递归实现 注意事项&#xff1a;即使排序的数字个数不为2的倍数也可正常分解&#xff0c;其思想没有规定一定要左右数目对称才可合并 注意事项&#xff1a;归并的思想还适用于外排序 2.递归改循环 注意事项&#xff1a;边界处理与非2的n次方倍的处理 版本1&…

基于HTTP GET方式获取网络时间的实现

上一节&#xff0c;我们介绍了基于NTP服务器获取网络时间的例子&#xff0c;但在有些情况下&#xff0c;比如我最近在使用RNDIS协议通过4G模块上网&#xff0c;这个协议不支持UDP协议&#xff0c;所以就用不了NTP服务器。或者有时候我们需要有更多的网络时间获取方式&#xff0…

RK3568平台开发系列讲解(SPI篇)spi_dev 驱动分析

🚀返回专栏总目录 文章目录 一、结构体二、API三、spidev驱动分析3.1、init3.2、probe3.3、spidev_write3.4、spidev_read3.5、spidev_open四、spi_register_driver分析五、spi_dev缺点沉淀、分享、成长

SpringBoot解决CORS跨域——@CrossOrigin

前端请求后端报错了。 状态码&#xff1a;403 返回错误&#xff1a;Invalid coRs request 一个注解就搞定了。 在类上加 CrossOrigin

查看Linux系统是Ubuntu还是CentOS

要查看Linux系统是Ubuntu还是CentOS&#xff0c;可以通过多种方式进行确认&#xff1a; 查看/etc/os-release文件&#xff1a; 在终端中执行以下命令&#xff1a; cat /etc/os-release 如果输出中包含"IDubuntu"&#xff0c;则表示系统是Ubuntu&#xff1b;如果输出中…

windows驱动开发-PCI和中断(二)

谈到中断使用PCI总线来作为例子是最合适的&#xff0c;在Windows发展过程中&#xff0c;PCI作为最成功的底层总线&#xff0c;集成了大量的外设&#xff0c;不夸张的说&#xff0c;目前PCI几乎是唯一的总线选择&#xff0c;故大部分情况下&#xff0c;只有PCI设备驱动程序会遇到…

java项目之企业资产管理系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业资产管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能有个人中心&…

SQL Server (MSSQLSERVER) 服务无法启动

解决方法&#xff1a; 打开服务&#xff0c;右键SQL Server (MSSQLSERVER) ->属性->登录&#xff0c;改为本地系统用户

小果网页---套利系统添加了可以套利模块,提供数据api

最近在小果套利系统里面添加了一下可以套利模块&#xff0c;同时实现了盘中自动更新&#xff0c;30分钟更新一次。给大家提交交易参考&#xff0c;可以套利模块的选择 dfdf[df[申购状态] !暂停申购]dfdf[df[申购限额] !无限额]df[溢价率]df[溢价率].astype(float)df[成交量]df…

Nginx的正向代理与反向代理

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 今天&#xff0c;我们将一起了解什么是Nginx的正向代理&#xff1f;什么是Nginx的反向代理&#xff1f;并实际动手实践。 以下内容都是满满的干货&#xff0c;绝对不容错过。我建议先收藏这篇文章&#xff0c;然后找一…

项目管理-案例重点知识(整合管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、整合管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;项目章程内容和作用 &#xff08;2&#xff09;项目管理计划…

linux系统介绍和安装教程(含安装链接放在最下面了)

一、linux系统简介 在Linux和C语言的发展历程中&#xff0c;有几位关键人物为它们的诞生和推广做出了重要贡献。 首先&#xff0c;肯汤姆森&#xff08;Ken Thompson&#xff09;是一位在AT&T公司工作的员工&#xff0c;他不仅发明了B语言&#xff0c;还创造了Unix系统。…

python怎么读取xml

引入XML组件&#xff1a;import xml.dom.minidom。 创建一个xml文件&#xff0c;<?xml version"1.0" encoding"utf-8"?>。 加载读取XML文件&#xff0c;xml.dom.minidom.parse(abc.xml)&#xff0c;这是xml文件的对象。 获取XML文档对象&#xff0…