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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

批量提取指定目录下的所有文件名

::批量提取指定目录下的所有文件名&#xff1a; echo off chcp 65001 > nul setlocal enabledelayedexpansion set "folder目录路径" for /r "%folder%" %%F in (*) do ( set "filename%%~nxF" echo !filename! ) endlocal pause…

ASIL详解

概念 随着汽车新四化的发展&#xff0c;整车E/E系统的复杂性也不断增加&#xff0c;功能安全正成为一种更主流的要求。汽车安全完整性等级&#xff08;ASIL&#xff09;分解为实现更高水平的诊断覆盖度提供了可靠而稳健的途径&#xff0c;并在开发具有更高ASIL等级的安全关键系…

Edge浏览器自动翻译功能按钮不见了

前言&#xff1a; 平时偶尔会用到Edge的页面翻译功能&#xff0c;使用挺方便。突然发现Edge浏览器的翻译功能不见 了。如下图所示&#xff1a; 解决思路&#xff1a; 1、从网上找各种解决方案也没有解决&#xff0c;其中有一个说到点右上角的三个点 2、点击设置…

专业矢量绘图软件Sketch for mac v100中文激活版

Sketch for Mac 是一款专业的矢量图形设计工具&#xff0c;主要用于 UI/UX 设计、网页设计、图标设计等领域。它的界面简洁、易用&#xff0c;功能强大&#xff0c;可以帮助设计师快速创建高质量的设计作品。 Sketch for Mac 可以轻松地创建矢量图形、图标、网页布局、移动应用…

利用关系感知一致性和虚拟特征补偿解决医学分类中的长尾问题

文章目录 Combat Long-Tails in Medical Classification with Relation-Aware Consistency and Virtual Features Compensation摘要方法实验结果 Combat Long-Tails in Medical Classification with Relation-Aware Consistency and Virtual Features Compensation 摘要 由于…

SpringBoot接收参数的19种方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583

业务系统加固和安全设备加固

业务系统加固 业务系统包含哪些系统? 业务系统漏洞面临的风险 1web风险 2漏洞扫描&#xff0c;端口扫描 3系统漏洞 4逻辑漏洞 5 信息泄露 6拒绝服务 7口令爆破 加固方式&#xff1a; 在风险加上修复 1web漏洞&#xff1a; 包括csrf,xss&#xff0c;口令破解等等 修…

仿C#或Java基础类型自定义

class Int{ private:int _value 0; public:operator int() const{ // 隐式转换return _value;}// 显式转换explicit operator int*() const { return nullptr; }operator(const int page){_value page;}operator float() const{return static_cast<float>(_value);}ope…

如何利用AI生成答辩PPT?笔灵AI答辩PPT,智能识别关键点

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

Java后端的字符串相等、集合非空判定

一.字符串相等判定 使用工具类的判定 使用原始方法 在调用equals()之前显式地检查对象是否为null&#xff1a; 将常量字符串放在前面调用equals()&#xff0c;这样即使roleCode为null也不会抛出NullPointerException&#xff1a; 二.集合非空判定 使用工具类 原始&#xff0…

Python-VBA函数之旅-vars函数

目录 一、vars函数的常见应用场景 二、vars函数使用注意事项 三、如何用好vars函数&#xff1f; 1、vars函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、vars函数…

数据结构--AVL树

一、什么是AVL树 1、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在…

YOLOv5独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv5结合:替代YOLOv5的backbone 收录 YOL…

一表捋清网络安全等级保护测评要求

三级网络安全等级保护测评指标&#xff1a; 对于中小企事业单位来说&#xff0c;网络安全建设是一个复杂且投入较高的过程&#xff0c;因此他们更倾向于寻找一种“省心省力”的等保建设方案&#xff0c;以及一种能够持续有效且具有较高性价比的网络安全建设投入方式。 此时&…

直流无刷电机控制(一)六步换相(有感霍尔)附六步换相实现代码

直流无刷电机概述 直流无刷电机的转子为永磁铁&#xff0c;定子为换相线圈&#xff0c;有别于有刷电机通过电刷或者换向器换相&#xff0c;无刷电机通过控制器电子换相。 极对数 直流无刷电机采用永磁铁作为转子&#xff0c;一对NS磁极为一极对&#xff0c;为了使电机运转更…

【js】获取媒体流实现拍照功能,摄像头切换

<script setup>import {onMounted,reactive,ref} from vueconst videoConstraints reactive({width: 500,height: 300});let picArr reactive([])let videoNode ref(null)let show ref(true)let stream reactive({})onMounted(async () > {// 获取视频流&#xf…

语义分割——高分卫星土地覆盖数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…

深入解析Linux逻辑卷管理器(LVM)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是逻辑卷管理器&…

一觉醒来 AI科技圈发生的大小事儿 05月14日

&#x1f4f3;人类成功实现「蓝牙上天」&#xff01;接收来自600公里外太空信号 一家名为Hubble Network的初创公司成功实现了从地球到太空的蓝牙连接&#xff0c;通过SpaceX将两颗卫星送入轨道&#xff0c;从600公里外的卫星接收信号。他们开发了软件和相控阵天线&#xff0c…