010.理解异步性

news2024/12/26 22:44:23

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

同步执行意味着您必须等待一个任务完成,然后才能继续执行下一个任务。同步执行的一个现实例子发生在快餐店:你走向柜台的工作人员,在店员等待的时候决定要点什么,点你的食物,一直等到饭菜准备好。店员等着你把钱交出来,然后给你食物。只有这样,你才能继续下一个任务,去你的桌子吃饭。这个序列如图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 myConnectivity
	where connectivity == Connectivity.Online
	from 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.coloradmin.cn/o/1679193.html

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

相关文章

评价决策类-层次分析法

师从江北 问题引出 归一化处理&#xff1a;指标的数组[a b c]归一化处理得到[a/(abc),b/(abc),c/(abc)] 因为每个指标的重要性不同&#xff0c;所以要加上一个权重 如何科学的确定权重&#xff0c;就要用到层次分析法&#xff08;AHP&#xff09; 模型原理 建立递阶层次结构模…

利用一下Chat-GPT写两段处理字符串的简单样例ABAP程序。这样可以大大提高工作效率。Chat-GPT的能力真是让人震撼。

我让Caht-GPT写两段ABAP 程序&#xff0c;第一段程序要求如下&#xff1a; 判读字符串里面是否含有特殊字符&#xff0c;这里说的特殊字符不包括键盘上能够输入的字符&#xff0c;如果有这样的特殊字符则输出来。 DATA: lv_string TYPE string VALUE 你的字符串,lv_result TYP…

数据结构——二叉树知识点详解!

引言&#xff1a;本篇博客将详细介绍到数据结构中的又一位大将——二叉树。它也是我们目前学到的第一个非线性的数据结构。并且本章将学到的概念居多&#xff0c;希望大家可以理解并牢记。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 目录 一&#xff0…

node.js的Express框架的介绍 与 安装详细教程

一、Express框架介绍 &#xff08;1&#xff09;Express定义&#xff1a; Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用&#xff0c;和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 &#xff08…

微信小程序快速开发-基础内容(内容真的又多又干货)

目录 实现横向布局效果 实现滚动效果 实现轮播图效果 实现文本长按选中复制效果 渲染 HTML 标签 按钮组件的使用效果 图片组件的使用效果 Mustache 语法 动态绑定内容&#xff08;定义变量&#xff0c;渲染变量&#xff09; 动态绑定属性&#xff08;将属性定义为变量…

2024年中国国际厨卫家居展览会(上海KIB厨卫展)

中国国际厨卫家居博览会&#xff08;KIB&#xff09;由中国五金制品协会、中国国际贸易促进委员会轻工行业分会、北京奥维云网大数据科技股份有限公司主办。从最初的“中国国际橱柜、厨房卫浴产品与技术博览会(CIKB&#xff09;”&#xff0c;到2001年与中国国际五金展&#xf…

LSTM与GAN创新结合!模型性能起飞,准确率超98%

今天来聊一个深度学习领域非常具有创新性的研究方向&#xff1a;LSTM结合GAN。 LSTM擅长处理和记忆长期的时间依赖关系&#xff0c;而GAN可以学习复杂的数据分布并生成逼真的数据样本。通过充分结合两者的优势&#xff0c;我们可以增强模型对复杂数据的处理能力&#xff0c;提…

scanf读取标准输入

内容 scanf函数的原理 多种数据类型混合输入 常用的数据输入/输出函数 程序员可以给程序输入数据&#xff0c;程序处理后会返回一个输出。C语言通过函数库读取标准输入&#xff0c;然后通过对应函数处理将结果打印到屏幕上&#xff0c;printf函数可以将结果打印到屏幕上。下…

英语学习笔记14——What color‘s your ... ?

What color’s your … ? 你的 …… 是什么颜色的&#xff1f; 词汇 Vocabulary case n. 箱子【封闭的】 相关&#xff1a;box n. 箱子【开口的】    bookcase n. 书架 补充&#xff1a;case n. 案件&#xff0c;案例 口语&#xff1a;It’s a small case.    小意思&…

稚晖君独家撰文:具身智能即将为通用机器人补全最后一块拼图

具身智能新纪元。 *本文为稚晖君独家供稿,「甲子光年」经智元机器人授权发布。稚晖君本名彭志辉,先后任职OPPO、华为,现为智元机器人CTO、首席架构师。 在ChatGPT之后,又一个大模型概念火了——具身智能(Embodied AI)。 在学术界,图灵奖得主、上海期智研究院院长姚期…

【数据结构】堆(超详细)

文章目录 前言堆的概念及结构堆的实现堆的向下调整算法&#xff08;建小堆为例&#xff09;堆的向上调整算法&#xff08;建小堆为例&#xff09;堆的初始化销毁堆堆的插入堆的删除(规定删堆顶的数据)取堆顶元素判断堆是否为空获取堆的个数 完整代码&#xff08;包括测试代码&a…

解决kali Linux2024无法获取动态IPv4地址(DHCP)解决方案

用root用户启动终端 进入根目录&#xff0c;选择配置文件 cd到根目录下/../etc/network找到interfaces文件 编辑interfaces文件 vi interfaces&#xff0c;编辑interfaces文件 输入如下命令 打开虚拟网络编辑器 选择虚拟机选项卡&#xff0c;编辑&#xff0c;打开虚拟网络编…

【Linux 网络】网络基础(二)(应用层协议:HTTP、HTTPS)-- 详解

我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。 前面写的套接字接口都是传输层经过对 UDP 和 TCP 数据发送能力的包装&#xff0c;以文件的形式呈现给我们&#xff0c;让我们可以进行应用层编程。换而言之&#xff0c…

50.乐理基础-拍号的类型-混合拍子

混合拍子的定义&#xff1a; 1.由不同的单拍子组合起来的&#xff0c;如图1。 2.因为组合顺序有多种可能&#xff0c;所以次强拍的位置也有多种可能&#xff0c;如图3。 图1&#xff1a;四二拍是单拍子&#xff0c;四三拍也是单拍子&#xff0c;四二拍 与 四三拍就是 不同的单拍…

网络游戏同步技术六:若干问题探讨

本文探讨网络同步的几个问题。 王者荣耀使用帧同步明智吗&#xff1f; 这个很难评&#xff0c;成王败寇&#xff0c;它成功了&#xff0c;它就是明智的。但是帧同步带来的心智负担还是很重的&#xff0c;他们的分享里面也提到他们花了很大的功夫去解决不一致问题。 个人更喜欢…

Sketch总结

sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…

定时发圈操作介绍

1、登陆已有的账号&#xff0c;点击到"朋友圈"功能 2、选择要发圈的微信号&#xff0c;编辑发圈的文案内容 3、自定义想要的时间点 4、点击"立即发送" 5、可进行跟圈

校园防欺凌平台

校园霸凌事件很难被发现&#xff0c;发现者又可能迫于威胁而不敢告发&#xff0c;被霸凌者又因各种原因而选择忍耐&#xff0c;所以&#xff0c;如果能够在发生校园霸凌的时候&#xff0c;做出及时的预警&#xff0c;也许能够拯救挽回无数个家庭。本平台结合防欺凌设备&#xf…

Transformer - Self-Attention层的复杂度的计算

Transformer - Self-Attention层的复杂度的计算 flyfish 矩阵的维度 下面矩阵的维度是32即 3行&#xff0c;2列 6,10等都是矩阵里的元素 如果矩阵A的列数与矩阵B的行数相同&#xff0c;那么这两个矩阵可以相乘。即&#xff0c;若A是一个mn矩阵&#xff0c;B是一个np矩阵&am…

python文件操作常用方法(读写txt、xlsx、CSV、和json文件)

引言 用代码做分析的时候经常需要保存中间成果&#xff0c;保存文件格式各不相同&#xff0c;在这里好好总结一下关于python文件操作的方法和注意事项 Python 提供了丰富的文件操作功能&#xff0c;允许我们创建、读取、更新和删除文件。允许程序与外部世界进行交互。 文章目录…