程序员修神之路:问世间异步为何物?

kafka实现异步发送_关于高并发下kafka producer send异步发送耗时问题的分析 最近开发网关服务的过程当中,需要用到kafka转发消息与保存日志,在进行压测的过程中由于是多线程并发操作kafka producer 进行异步send,发现send耗时有时会达到几十毫秒的阻塞,很大程度上上影响了并发的性能,而在后续的测试中发现单线程发送反而比多线程发送效率高出几倍。所以就对kafka API send 的源码进行了一下跟踪和分析,在此总结记录一下。首先看springboot下 k... 阅读详情

 

作者 | 菜菜

责编 | 郭芮

 

Y妹:菜菜哥,老大说把所有的接口都改成异步操作......

菜菜:异步好呀,最少比同步能提高吞吐量。

Y妹:异步是怎么回事呢,能讲讲不?

菜菜:来,哥给你解释一番。

 

 

 

异步定义

 

 

关于异步的定义,网上有很多不同的形式,但是归根结底中心思想是不变的。无论是在HTTP请求调用的层面,还是在CPU内核态和用户态传输数据的层面,异步这个行为针对的是调用方:

一个可以无需等待被调用方的返回值就让操作继续进行的方法。

在多数程序员的概念中一般是指线程处理的层面:

异步是计算机多线程的异步处理。与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。

 

可以这样通俗的理解,异步主要解决的问题是不阻塞调用方,用方这里可以是HTTP请求的发起者,也可以是一个线程。

 

但此处需要明确的是:异步与多线程与并行不是同一个概念。

 

 

 

CPU密集型操作

 

 

我听有的同学说,异步解决的是IO密集型的操作,我觉得是不准确的。异步同样可以解决CPU密集型操作,只不过场景有限而已。

 

有一个前提:利用异步解决CPU密集型操作要求当前运行环境支持多线程才行,比如JavaScript这个语言,本质上它的运行环境是单线程的,所以对于CPU密集型操作,JavaScript会显得力不从心。

 

异步解决CPU密集操作一般情况下发生在同进程中,为什么这么说呢,如果发生在不同机器或者不同进程在很多情况下已经属于IO密集型的范围了。这里顺便提醒一下:IO操作可不单单是指磁盘的操作,所有有输入/输出(Input/Output)操作的都可以泛称为IO。

 

举个栗子吧:

 

在一个带有UI的软件上点击一个按钮,UI线程会发生操作行为,假如UI线程在执行过程中有一个计算比较耗时的操作(你可以想象成计算1--999999999的和),UI线程在同步操作的情况下会一直等待计算结果,在计算完毕之后才会继续执行剩余操作。在等待的这个过程中,呈现给用户的情况就是UI卡住了,俗称假死了,带给用户的体验是非常不好的。这种情况下,我们可以新启动一个线程去执行这个耗时的操作,当执行完毕,利用某种通知机制来通知原来线程,以便原来线程继续自己的操作。

 

启动新线程执行CPU密集型操作利用的其实就是多线程的优势,如果是单核CPU,其实这种优势并不明显。

 

 

 

IO密集型操作

 

 

异步的优势在IO密集型操作中表现的淋漓尽致,无论是读取一个文件还是发起一个网络请求,我的建议是尽量使用异步。

 

这里首先普及一个小知识:其实每个外设设备都有自己的处理器,比如磁盘,所以每个外设设备都可以处理自己相应的请求操作。但是处理外设设备信息的速度和CPU的执行速度来比较有着天壤之别。

 

 

上图展示了不同的 IO 操作所占用的 CPU 时钟周期。

 

在计算机中,CPU的运算速度最快,以其的运算速度为基准,时钟周期为1。其次是一级缓存、二级缓存和内存,硬盘和网络最慢,它们所花费的时钟周期和内存所花费的时钟周期差距在五位数以上,更不用提跟CPU和一级缓存、二级缓存的差距了。

 

由于速度的差距,所以几乎所有的IO操作都推荐使用异步。比如当读取磁盘一个文件的时候,同步状态下当前线程在等待读取的结果,这个线程闲置的时间几乎可以用蛋疼来形容。所以现代的几乎所有的知名第三方的操作都是异步操作,尤其以Redis、Nodejs 为代表的单线程运行环境令人刮目相看。

 

现在是微服务盛行的时代,UI往往一个简单的按钮操作,其实在后台程序可能调用了几个甚至更多的微服务接口(关于微服务这里不展开),如果程序是同步操作的话,那响应时间是这些服务接口响应时间的和,但是如果采用的是异步操作,调用方可以在瞬间把调用服务接口的操作发送出去,线程可以继续执行下边代码或者等待所有的服务接口返回值也可以。

 

最差的情况下,接口的响应时间为最慢的那个服务接口响应时间,这有点类似于木桶效应。

 

 

 

异步的回调

 

 

通过以上介绍,我们一定要记住一个知识点:异步需要回调机制。

 

异步操作之所以能在执行结果完成之后继续执行下面程序完全归功于回调,这也是所有异步场景的核心所在,前到JS的异步回调,后到CPU内核空间copy数据到用户空间完成通知等等异步场景,回调无处不在。

 

说道回调大部分语言都是注册一个回调函数,比如JS会把回调的方法注册到执行的队列,C#会把回调注册到IOCP。这里延伸一下,在很多系统里,很多IO网络模型其实是属于同步范畴的,比如多路复用技术,真正异步非阻塞的推荐Windows下的IOCP。

 

现在很多现代语言都支持更优秀的回调方式,比如JS和C# 现在都支持async 和await方式来进行异步操作。

 

据说Windows下的IOCP才是真正的异步非阻塞模型,求留言区验证!

 

 

 

 

异步的特点

 

 

优势:

 

  • 异步操作无须额外的线程负担,使用回调的方式进行后续处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少 共享变量的数量),减少了死锁的可能。

  • 线程数量的减少,减少了线程上下文在CPU切换的开销。

  • 微服务环境(调用多个服务接口的情况下)加快了上层接口的响应时间,意味着增加了上层接口的吞吐量。

 

劣势:

 

  • 异步操作传统的做法都是通过回调函数来实现,与同步的思维有些差异,而且难以调试。

  • 如果当前环境有操作顺序的要求,异步操作为了保证执行的顺序需要做额外的工作。

  • 由于多数情况下异步的回调过程中的执行线程并非原来的线程,所以在捕获异常,上下文传递等方面需要做特殊处理,特别是不同线程共享代码或共享数据时容易出问题。

 

 

 

写在最后

 

 

  • 在并发量较小的情况下,阻塞式 IO和异步IO的差距可能不是那么明显,但随着并发量的增加,异步IO的优势将会越来越大,吞吐率和性能上的差距也会越来越明显。

  • 在压力比较小的情况下,一般异步请求的响应时间大于同步请求的响应时间,因为异步的回调也是需要时间的。

  • 在大并发的情况下,采用异步调用的程序所用线程数要远远小于同步调用程序所用的线程数,CPU使用率也一样(因为避免了太多线程上下文切换的成本)。

 

为了系统性能,不要让任何设备停下来休息。

 

作者:菜菜,一个奔走在通往互联网更高之路的工程师,热衷于互联网技术。目前就职于某互联网教育公司,应用服务端主要负责人。拥有10年+互联网开发经验,热衷于高性能、高并发、分布式技术领域的研究,主要工作语言为C#和Golang 。

声明:本文为作者投稿,版权归其个人所有。

202505系分论文《论软件系统测试方法及应用》 本文以软件测试方法为切入点,重点论述分层协作、智能赋能、全流程三个维度下传统测试与自动化测试的融合应用。 阅读详情

相关推荐

MIPI DPHY接口(基于Xilinx FPGA实现)案例分析

在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层)。截止目前为止,Xilinx仅在Ultrascale+及其以上版本的FPGA IO可直接支持MIPI 电平输入,其他的,都需要转换成LVDS来接收。

ONEFPGA的博客 5636

操作系统应该如何在多CPU上调度工作?

本章将介绍多处理器调度(multiprocessor scheduling)的基础知识。由于本章内容相对较深,建议认真学习并发相关的内容后再读。 过去很多年,多处理器(multiprocessor)系统只存在于高端服务器中。现在,它们越来越多地出现在个人PC、笔记本电脑甚至移动设备上。多核处理器(multicore)将多个CPU核组装在一块芯片上,是这种扩散的根源。由于计算机的架构师们当时难以让单...

人邮异步社区 4671

Midscene.js(3):手把手教你用 YAML 脚本实现 AI 驱动的 Web UI 自动化「喂饭教程」

Midscene.js是一款开源的AI驱动UI自动化工具,通过自然语言描述即可控制浏览器或Android设备执行操作。它支持YAML脚本编写测试用例,降低了自动化测试门槛。

blues_C的博客 3246

【操作系统】进程的异步性

异步性是指进程以不可预知的速度向前推进。内存中的每个进程何时执行,何时暂停,以怎样的速度向前推进,每道程序总共需要多少时间才能完成等,都是不可预知的。是程序并发执行时,程序之间的相互制约关系导致了并发程序这种“执行——暂停——执行”这种间断性的活动规律。 比如,当正在执行的进程提出某种资源请求时,如打印请求,而此时打印机正在为其他某进程打印,由于打印机属于临界资源,因此正在执行的进程必须等待,且...

柳婼 の blog 1万+

【OpenClaw从入门到精通】第73篇:30天OpenClaw实战挑战——从零搭建个人数字助理(Day15-21)万字超详细高阶实战版

经过前两周的基础部署与功能搭建,你已拥有可自动化干活的AI助理与数字员工团队,但距离“高阶精通”仍有差距。本文聚焦第三周(Day15-21)核心实战,围绕安全审计、语音能力接入、Token成本控制、Agent Loop优化、One-Liner指令五大核心模块,结合真实落地案例与踩坑经验,提供超详细实操指南。通过本文,你将掌握生产级安全加固方案、语音交互全流程配置、低成本高性价比使用策略、Agent自主闭环优化技巧,以及一句话搞定复杂任务的高效指令用法,同时完成中期复盘与最后九天冲刺规划

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 364

Pytorch入门教程

Pytorch学习总结:1.张量Tensor 张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量对模型的输入和输出以及模型的参数进行编码。 张量类似于NumPy的ndarray,除了张量可以在 GPU 或其他硬件加速器上运行。事实上,张量和NumPy数组通常可以共享相同的底层内存,从而无需复制数据。...

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 4万+

程序员修神之路--问世间异步为何物?

菜菜哥,今天天气挺热的,我都穿裙子了 说吧,什么事?? 苦笑一下..... 老大说把所有的接口都改成异步操作 异步好呀,最少比同步能提高吞吐量 异步是怎么回事呢,能讲讲不? 来,凑近一点,哥给你解释一番 ◆◆异步定义◆◆ 关于异步的定义,网上有很多不同的形式,但是归根结底中心思想是不变的。无论是在http请求调用的层面,还是在cpu内核态和用户...

weixin_30596023的博客 275

【原理图PCB专题】Cadence17.4 PCB位号重排与反标

Cadence17.4 PCB位号重排与反标比Cadence16版本更简单一些,那到底如何操作?

一点硬件 1182

6月书讯(上)| 浅夏读新书,与世间万物一起成长

浅夏正是读书时~在骄阳、绿荫、清风里拿起一本好书,与世间万物一起成长~快来看看哪本书最属你心意。参与文末赠书活动,好书就要抢先读。— 新书速览—1、《Java核心技术 卷I:开发基础(原书第12版)》2、《Go语言学习指南:惯例模式与编程实践》3、《链接器和加载器》4、《多处理器编程的艺术(原书第2版)》5、《汇编语言:基于x86处理器(原书第8版)》6、《模式分类(原...

华章IT官方博客 543

27、目标识别的最新进展

本文综述了目标识别(OID)领域的最新进展,重点介绍了质量评估、预处理和搜索空间缩减等关键技术。文章分析了多种质量指标,如缩减率、对完整性、召回率和精确率等,并探讨了它们的适用场景。同时,详细介绍了预处理中自动学习转换规则的方法,以及传统阻塞、排序邻域索引等搜索空间缩减技术。此外,文章还讨论了动态选择缩减技术的方法,并展望了未来研究方向,如更智能的预处理、自适应的缩减技术和与人工智能的结合。希望这些技术和方法能够为目标识别领域的研究和实践提供参考和帮助。

q5r6s7的博客 93

RK3588,V4l2 读取Gmsl相机, Rga yuv422转换rgb (dma), 实现零拷贝

RK3588, 使用V4l2 读取 gmsl 相机,获得yuv422格式图像, 使用 rga 转换 rgb 图像。减少cpu占用率. 内存管理方式采用 dma,实现零拷贝.

J。 1263

《编程之道Tao of Programming》中的管理智慧:如何避免程序员离职潮?

在当今快速发展的科技行业,程序员离职潮已成为许多企业面临的严峻挑战。Geoffrey James于1987年创作的《编程之道》(Tao of Programming)作为编程界的"道德经",其中蕴含的管理智慧至今仍具有深刻的现实意义。这部中英双语版的经典作品不仅探讨了编程哲学,更揭示了如何通过理解程序员思维来有效管理技术团队,从而避免人才流失的终极指南。 ## 为什么程序员会纷纷离职?🤔 《

gitblog_00747的博客 443

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增。对源码有需求的,订阅本专栏后,私信我领取。、原来的vb脚本改为。

Z's Palace 1416

Python黑魔法 --- 异步IO( asyncio) 协程

Python黑魔法 --- 异步IO( asyncio) 协程 人世间关注 62017.01.17 11:12:26字数 3,396阅读 53,936 python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。P...

262

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一杯红酒配代码的异步思考

上学那会儿写过读后感、观后感,大多都是围绕爱国主义题材,标榜主人公的爱国情操。最终抒发廉价的爱国之情,再做做为国家做贡献的保证,千篇一律,毫无新意。         工作这些年里,在浩瀚如海的程序段中,当被汹涌的代码洋流冲晕了头脑时,这短暂而又宝贵的闲暇时间点正是我一杯红酒配电影的惬意之刻。之前是时光,近而又转向文艺年青聚堆的豆瓣。大多都在各路“学派”不同文笔的感叹与发泄中进行爬楼拜阅。

添翼软件 1449

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《程序员之禅》一一1.2 什么是禅

本节书摘来自异步社区出版社《程序员之禅》一书中的第1章,第1.2节,作者:【德】Christian Grobmeier,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 什么是禅 程序员之禅1.2.1 佛陀乔达摩·悉达多在了解禅之前,我们需要先了解下佛教。乔达摩·悉达多创立了众所周知的佛教。他是净饭王之子,出生于公元前563年。(在悉达多小的...

weixin_34104341的博客 444

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

黑马程序员——交通灯管理系统学习笔记

------- android培训、java培训、期待与您交流! ---------- 交通灯管理系统学习笔记 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:  异步随机生成按照各个路线行驶的车辆。 例如:        由南向而来去往北向的车辆 ---- 直行车辆        由西向而来去往南向的车辆 ---- 右转车辆        由东向而来去往南向的车辆 ---- 左

qq540795382的专栏 1119

程序员的护城河-并发编程

世间不如意十之八九。如果没办法一次到位,就分阶段实现吧。学习JUC是完善整个后端体系必不可少的一环,因为很多Java后端的中间件或者框架其本身内部大量的涉及到了JUC的部分,并且也可以在阅读JUC源码的过程中明白思想,其实思想都是互通的,例如ReentrantLock的原理本质上和Redisson 的原理是类似的,那么就可以迅速过度到分布式锁的使用中。

爱吃知识的土豆倪的博客 1332

python黑魔法asyncio_Python黑魔法 --- 异步IO( asyncio) 协程

来源:人世间www.jianshu.com/p/b5e347b3a17cpython asyncio网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。Python的在3.4中引入了协程的概念,可是这个还是以生成器对象为基础,3.5则确定了协程的语...

weixin_30995661的博客 454

C# 语法:await与async的正确打开方式

点击上方“程序员大咖”,选择“置顶公众号”关键时刻,第一时间送达!    先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 419

2024年Android最全做了八年的Android开发,谁不是一边崩溃,一边默默坚守!,android界面开发工具

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

2401_84132685的博客 778

股市与游戏程序员

有人的地方就有江湖,有江湖的地方就有流派。在投资界,若巴菲特、彼特林奇一宗是九阳真经,武林正道,以绵绵不绝的内力和朴实无华的招式号令天下,那浑水、香橼之流做空公司,则是武林异类,苦修吸星大法,劫人钱财于做空之际,人见人惧,却无法忽视之。在这些名门恶衙之外,还有一群高频密宗,着实高筑墙(或许永远金融圈最强的设备)、广积粮(闷声发大财)、缓称王(低调无名),世人罕知其存在却不知自己单单交易或许都曾经过...

weixin_30411819的博客 163

(转)Python黑魔法 --- 异步IO( asyncio) 协程

转自:http://www.jianshu.com/p/b5e347b3a17c?from=timeline Python黑魔法 --- 异步IO( asyncio) 协程 作者人世间关注 2017.01.17 11:12*字数 3396阅读 2856评论 9喜欢 33 python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进...

weixin_30448685的博客 90

js promise的用法_Promise 初使用

promise初使用promise是es6是新增的构造器,用来提供另一种异步代码的实现方案。本文介绍了Promise的基本使用,并给出了用它来改写异步回调函数的套路。1 简介本文介绍了Promise的构造器的使用语法,promise对象的三种状态及状态转换,并分析了其经典格式的执行流程,最后给出了用它来改写异步代码的套路,并予以实践。你最好需要有一些ajax,箭头函数的基础这会理解更深一...

weixin_39969340的博客 243

promise初使用详细教学

promise初使用 promise是es6是新增的构造器,用来提供另一种异步代码的实现方案。本文介绍了Promise的基本使用,并给出了用它来改写异步回调函数的套路。 1 简介 本文介绍了Promise的构造器的使用语法,promise对象的三种状态及状态转换,并分析了其经典格式的执行流程,最后给出了用它来改写异步代码的套路,并予以实践。 你最好需要有一些ajax,箭头函数的基础这会理解更深一些。当然啦,也有可能你还没有需要用它们的时候。 2 主要内容 •什么是promise•Promis

sqLeiQ的博客 965
上一篇: Fuck标准库系列:Object.prototype.filter
下一篇: 信息论入门:信息守恒定律与纠错码
xosg
xosg 领域专家: 网络协议与安全技术领域 领域专家: 网络协议与安全技术领域
博客等级 码龄9年 1986粉丝 864原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值