前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >自古以来,同步/异步都是八股文第一章

自古以来,同步/异步都是八股文第一章

作者头像
有态度的马甲
发布于 2023-09-18 02:53:59
发布于 2023-09-18 02:53:59
22800
代码可运行
举报
文章被收录于专栏:精益码农精益码农
运行总次数:0
代码可运行
成文耗时2小时,阅读8min,有用指数拉满。

好久没上线了,今天记录编程中老掉牙的几个关键术语,一个言简意赅的术语定义包含主谓宾定状补, 我们应从貌似雷同的术语中体会到不同术语的表象行为、侧重点。

下面给出的3对技术术语,都是很核心、易混淆的概念点,但是多少还是有些表象、侧重点的不同。

书读百遍其义自见, 请关注最下方给出的微软官方技术文献, 自勉!!

1. 同步/异步、 阻塞/非阻塞

阻塞操作不等于同步,非阻塞操作也不等于异步。实际上,它们之间并没有直接的联系。

先说同步,这个很简单,就是按照代码来顺序执行。

比如下面这段伪代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local res, err  = query-mysql(sql)
local value, err = query-redis(key)

在同一请求连接中,如果要等 MySQL 的查询结果返回后,才能继续去查询 Redis,那就是同步;

如果不用等 MySQL 的返回,就能继续往下走,去查询 Redis,那就是异步。

完全不care MYSQL的查询结果,也不是业务想要的,一般的实践是query-mysql函数快速返回一个awaitable对象,通过状态查询、事件通知的方式拿到异步行为的结果。

再来说说非阻塞,这是一个很容易和“异步”混淆的概念。

这里我们说的“阻塞”,特指阻塞操作系统线程

我们继续看上面的例子,假设查询 MySQL 需要1s 的时间,如果在这1s 内,操作系统的资源(CPU)是空闲着并傻傻地等待返回,那就是阻塞;

如果 CPU 趁机去处理其他连接的请求,那就是非阻塞。

总体而言:

同步/异步[1]虽然表现为函数调用,实际宏观上描述了信息对齐方式, 异步调用/异步通信/异步任务均表现为发出通信动作后即刻返回,通过状态通知、回调函数来拿到通信结果。

阻塞/非阻塞关注的是应用程序在等待数据返回的状态问题:在得到结果之前,cpu若傻傻等待是阻塞(被挂起)。

.NET异步编程的三种套路[2]

  1. (1). 基于任务的异步模式 (TAP), 主流推荐
  2. (2). 基于事件的异步模式 (EAP), 过时不推荐
  3. (3). 异步编程模型 (APM) 模式(也称为 IAsyncResult 模式), 过时不推荐

2,3已经不被推荐(2,3其实很贴近异步的行为认知),目前主流推荐的TAP async/await语法糖,以同步姿势简化了异步编程, 但是语法糖也让我们不容易理解异步的本质:async/await语法糖具备传染性,导致async/await在整个代码结构泛滥使用,在被传染的async/await层级, 根本不体现通信交互,弱化了开发者对于最底层是异步通信的认知。

微软喜欢搞拖拽控件、语法糖给到开发者,让我们沉迷于便利的开发体验,忽视了朴素的核心本质。

2. 事件/消息[3]

事件是对条件或状态更改的轻量级通知。

  • • 事件的发布者对如何处理事件没有期望。
  • • 事件的使用者决定如何处理通知。
  • • 事件报告状态变化并且是可操作的, 这是一个信号,消费者只需要知道发生了什么。事件数据包含关于发生了什么事情的信息,但不包含触发事件的数据。 例如,事件通知使用者文件已创建,它可能有关于文件的一般信息,但它没有文件本身。
  • • 事件可以是离散的个体,也可以是一系列事件的一部分。一系列事件报告了一种状况,并且是可分析的。这些事件是按时间顺序排列并相互关联的,消费者可通过序列事件来分析发生了什么。

消息是由服务生成的原始数据,将在其他地方使用或存储 。

  • • 消息包含触发消息管道的数据。
  • • 消息的发布者对于消费者如何处理消息有一个期望。双方之间存在一份契约。例如,发布者发送带有原始数据的消息,并期望消费者从该数据创建文件,并在工作完成时发送响应。
3. 委托/事件[4]

委托更像一个类的一个属性,只不过属性值是函数,公开的委托可以像类属性一样,自由赋值。

在众多语言中,委托与闭包密切相关。 传送门: 全网最通透的“闭包”认知 · 跨越语言

和委托类似,事件也是后期绑定机制。实际上,事件是建立在对委托的语言支持之上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 In the .NET class library, events are based on the EventHandler delegate and the EventArgs base class.  
public delegate void EventHandler(object? sender, EventArgs e);

后期绑定机制:组件通过调用可在运行时识别的方法进行通信。它们都支持单个和多个订阅服务器方法。这称为单播和多播支持。

两者均支持用于添加和删除处理程序的类似语法,引发事件和调用委托也是相同的调用语法。它们甚至都支持与 ?. 运算符结合的 Invoke() 语法。

使用委托/事件有一些考量:

(1). 若侦听器可选,更倾向事件

A组件引发了事件,也许并不引发其他组件的连锁反应,也就是没有预置侦听器,这时虽然用委托也行,但是更倾向用事件。

(2). 事件只能由定义事件的组件自行触发 ,而不能由外部触发。

包含事件的类以外的类只能添加和删除事件侦听器;只有包含事件的类才能引发事件。还是那句话,事件更强调组件在满足条件或自身状态变更时触发。

(3). 事件不care侦听器的返回值

与1相关,因为事件的引发者本身也不care有没有侦听器。

结语

搬砖多年,越来越体会到精准理解术语的重要性, 不管是日常技术撕逼,还是阅读文献,潜意识都要留意你认定的术语定义是不是与对方要表露的定义一致。

上面三对概念:冥冥中存在某种微妙联系。

同步/异步:描述了信息的对齐方式,如果是异步会即时返回,使用状态通知、回调事件(这个回调事件对应事件/消息的事件概念)来获得操作结果。

事件/消息:描述了信息的侧重点, 事件强调了某组件在满足某种条件、时间点而触发了某次行为,不care是否有消费方对这个行为产生了连锁反应。 消息是生产方要传递的原始数据,消息生产方对消息被消费是有期待的(存在消息格式便于消费方理解)。

委托/事件:更接近于事件的技术实现,事件是基于委托实现,事件更强调内生引发、不care是否有外部侦听动作,委托可认为是类属性。

引用链接

[1] 同步/异步: https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/ [2] .NET异步编程的三种套路: https://learn.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/ [3] 事件/消息: https://learn.microsoft.com/en-us/azure/service-bus-messaging/compare-messaging-services [4] 委托/事件: https://learn.microsoft.com/zh-cn/dotnet/csharp/distinguish-delegates-events

年终总结:2021技术文大盘点 | 打包过去,面向未来

项目总结:麻雀虽小,五脏俱全

理念总结:实话实说:只会.NET,会让我们一直处于鄙视链、食物链的下游

云原生系列: 什么是云原生?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-27 20:34,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java-单机版的书店管理系统(练习设计模块和思想_系列 八 )
Java-单机版的书店管理系统(练习设计模块和思想_系列 七 ) http://blog.csdn.net/qq_26525215/article/details/51190696
谙忆
2021/01/21
9360
Java-单机版的书店管理系统(练习设计模块和思想_系列 一 )
项目练习目标 : 1、Java应用程序基本分析 2、培养面向对象编程的基本思想 3、Java基本设计模式综合应用 4、掌握分层和接口的基本设计 5、构建合理的Java应用程序包结构 6、综合应用JSE所学习的知识 7、在应用中合理使用集合框架 8、在应用中综合使用swing的常用组件 9、基本的表现层的实现机制 10、IO流和文件的基本操作 11、培养良好的Java编程习惯 12、培养调试Java程序的能力,培养改错的能力
谙忆
2021/01/21
6030
Java-单机版的书店管理系统(练习设计模块和思想_系列 一 )
微服务架构开发实战:SpringCloudBus的设计原理
本节将介绍Spring Cloud Bus的设计原理。理解原理有利于更好地基于Spring Cloud Bus来进行二次开发。
愿天堂没有BUG
2022/10/28
4580
微服务架构开发实战:SpringCloudBus的设计原理
SpringCloud微服务实战:城市数据API微服务的实现
城市数据API微服务包含了城市数据查询组件。城市数据查询组件提供了城市数据查询的接口。
愿天堂没有BUG
2022/10/28
3800
SpringCloud微服务实战:城市数据API微服务的实现
微服务架构案例(02):业务架构设计,系统分层管理
整合流程基础SpringSecurity,JWT等组件开发。所属代码包:mopsz-admin-client。
知了一笑
2019/11/05
8910
微服务架构案例(02):业务架构设计,系统分层管理
四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢?
Java团长
2020/06/04
1.4K0
微服务开源框架TARS 之 基础组件
本文源自herman的系列文章之一《鹅厂开源框架TARS之基础组件》。相关代码已按TARS开源社区最新版本更新。
TARS基金会
2020/09/01
1.1K0
微服务开源框架TARS 之 基础组件
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 )
Java-单机版的书店管理系统(练习设计模块和思想_系列 四(2) ): http://blog.csdn.net/qq_26525215/article/details/51117135
谙忆
2021/01/21
4500
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 )
SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器、类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到D
用户1174983
2018/02/05
1.2K0
SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
Java-单机版的书店管理系统(练习设计模块和思想_系列 六 )
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 ) http://blog.csdn.net/qq_26525215/article/details/51136848
谙忆
2021/01/21
1K0
Java-单机版的书店管理系统(练习设计模块和思想_系列 六 )
微服务项目:尚融宝(27)(后端搭建:注册功能)
注意:将controller包中的UserInfoController移植到controller.api包下
一个风轻云淡
2022/11/15
2180
微服务项目:尚融宝(27)(后端搭建:注册功能)
Mybatis源码解析-执行流程(旧)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
冬天vs不冷
2025/01/20
1100
Mybatis源码解析-执行流程(旧)
手把手教你利用Spring Boot实现通用的接口参数校验
Spring 已经提供了一些注解用于接口参数的验证,但我个人认为这些注解提供的功能还是有限,因此自定义了一些注解。本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP,结合自定义注解实现通用的接口参数校验。
业余草
2020/11/12
8090
手把手教你利用Spring Boot实现通用的接口参数校验
Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)
      林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
bear_fish
2018/09/20
1.1K0
Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)
【微服务架构】介绍KivaKit框架
关键点 KivaKit是一个模块化Java框架,用于开发需要Java 11+虚拟机但与Java 8源代码兼容的微服务 KivaKit提供了实现应用程序的基本功能,包括命令行解析和应用程序配置 KivaKit组件是轻量级组件,使用广播/侦听器消息传递系统传递状态信息 KivaKit迷你框架,包括转换、验证、资源和日志迷你框架,通过消息传递使用和报告状态信息 KivaKit配置并运行Jetty、Jersey、Swagger和Apache Wicket,以一致的方式提供微服务接口 关键的KivaKit基类也可以
架构师研究会
2022/03/08
4450
微服务项目:尚融宝(41)(核心业务流程:借款额度审批)
列表的结果需要关联查询,数据字典的数据也需要展示对应的文本内容而不是值,除了定义VO的方式,我们也可以使用扩展实体类的方式 
一个风轻云淡
2022/11/15
3760
微服务项目:尚融宝(41)(核心业务流程:借款额度审批)
SpringBoot实现通用的接口参数校验,注解实战
本文介绍基于 SpringBoot和 JDK8编写一个结合自定义注解实现通用的接口参数校验。
搜云库技术团队
2020/02/13
1.1K0
微服务架构之服务冶理Dubbo-服务引用
注:公众号关于dubbo解读文章均基于apache-dubbo-incubating-2.7.1版本,发版于5月26号,此版本注册中心(多数是zookeeper)在某些特殊场景下会出现重复URL地址数据无法删除,导致消费方拿到的是失效地址,从而导致调用失败的问题。如果你也在使用此版本进行源码学习,在网络漂移(下班回家再调试源码)的情况下需要手动删除zookeeper的dubbo节点路径
公众号_松华说
2019/07/16
8650
SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
那么如何新增一个自定义的授权模式,比如像下面这样根据手机号和短信验证码进行登录呢?
JAVA日知录
2020/07/31
2.6K0
SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
Spring读源码系列番外篇08---BeanWrapper没有那么简单--上
Spring读源码系列番外篇08---BeanWrapper没有那么简单--上 引子 PropertyAccessor TypeConverter ConfigurablePropertyAccessor TypeConverterSupport TypeConverterDelegate AbstractPropertyAccessor AbstractNestablePropertyAccessor DirectFieldAccessor PropertyAccessor使用Demo PropertyV
大忽悠爱学习
2022/05/10
9550
Spring读源码系列番外篇08---BeanWrapper没有那么简单--上
推荐阅读
相关推荐
Java-单机版的书店管理系统(练习设计模块和思想_系列 八 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验