异步的学习
第一层:什么场景下需要异步
- 大量写操作占用了过多的资源,影响了系统的正常运行;
- 写操作异步后,不影响主流程,允许适当延迟;
第二层:异步的外功心法
本文提到了四种异步方式:
-
线程池模式
-
本地内存 + 定时任务
-
MQ 模式
-
Agent 服务 + MQ 模式
它们的共同特点是:将写操作命令存储在一个池子后,立刻响应给前端,减少写动作的耗时。任务服务异步从池子里获取任务后执行。
第三层:异步的本质
在笔者看来,异步是更细粒度的使用系统资源的一种方式。
在教研课程详情场景里,数据库的资源是固定的,但写操作占据大量数据库资源,导致整个系统的阻塞,但写操作并不是最核心的业务流程,它不应该占用那么多的系统资源。
不能为了异步而异步,无论是使用线程池,还是本地内存 + 定时任务 ,亦或是 MQ ,对数据库资源的使用都需要在合理的范围内,否则异步就达不到我们想要的效果。
参考:
有价值的评论:
异步是让系统的局部的资源使用增加了弹性和可缓冲性,而不是说把资源给更细化了。是把一些硬连接给变成可以相对滑动的弹性连接,就好像很多人去发快递,并不需要自己亲自去跑到收货人那里去,只是把包裹交给一个快递网点,然后它就返回了。如果它感兴趣后续的结果,后面的系统也可以在将来给它发送通知。
观看记录属于动态数据,跟数据库保存的用户信息、课程信息静态数据不同,静态数据往往对数据实时性、一致性要求很高,动态数据则不同。
对于这种爆发式增长的动态数据,不管是用本地文件、MQ还是自己内存缓存,本质上都是用了一个池子,选用一个合适的组件就可以,数据库采用读写分离、分库分表、批量插入等方式,数据库引擎也要正确设置。
但是,绝对不能用.net 的异步操作,把请求丢给线程池来处理,很快线程池就耗尽了、程序卡死。
很早我们使用C++去开发一些网络服务器时,给团队定了一个基本原则,在程序运行过程中不允许动态去创建内核对象(socket除外),不允许去new一块内存。
其他文章:
概念:
在异步模型中,允许同一时间发生(处理)多个事件。程序调用一个耗时较长的功能(方法)时,它并不会阻塞程序的执行流程,程序会继续往下执行。当功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果(如果有返回值或需要返回值时)。
1 2 3 | 比如,你和你的朋友决定一起做一顿午餐。“异步”就是你对朋友说:“你去商店买意大利面,回来的时候告诉我一声,然后一起做午餐。在你买意大利面的同时,我去准备番茄酱和饮料。” 而“线程”是:“你烧水,我加热番茄酱。当水烧开了,告诉我,我把意大利放进去。当番茄酱热了,你可以把奶酪添加进去。当两者都完成了,就可以坐下来一起吃晚餐。”在线程的示例中,我们可以看到“When,Do”的事件顺序,而这些顺序代表着每个人(线程)的指令集集合的顺序。 |
上述示例可以看出,多线程是与具体的执行者相关的,而异步是与任务相关的。
多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码,可以实现线程间的切换执行。
异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
多线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。
所以本质上,异步和多线程并不是一个同等关系,异步是最终目的,多线程只是实现异步的一种手段。
如何选择
面对多线程和异步,我们该如何选择呢?其实,通常情况下选择的依据是主要取决于性能。
那么,同步/异步与单线程/多线程之间的所有组合,哪种模型表现更好?
简而言之,对于具有大量 I/O 操作和不同计算的大规模应用程序,使用异步多线程有利于充分利用计算资源,并且能够照顾到非阻塞函数。这也是所有操作系统所采用的线程模型。
编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与正常的思维方式有些出入,而且难以调试。而多线程的使用(滥用)会给系统带来上下文切换的额外负担,并且线程间的共享变量可能造成死锁。
因此在实现这两种模式时,往往需要处理资源竞争、死锁、共享资源和回调事件等问题。
多线程只是异步编程的一种实现形式,单线程也可以实现异步(协程)
比如,我们可以使用同一个线程,在每个时间点,或每个事件后来执行异步任务(Future),从而实现异步,这就是单线程实现异步的方法
如 JavaScript 处理单线程异步调用的方法
Js 实现异步是通过一个执行栈与一个任务队列来完成异步操作的,所有同步任务都是在主线程上执行的,形成执行栈,任务队列中存放各种事件回调(也可以称作消息),当执行栈中的任务处理完成后,主线程就开始读取
任务队列中的任务并执行,不断往复循环
参考:有关单线程如何实现异步?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)