异步的学习

第一层:什么场景下需要异步

  • 大量写操作占用了过多的资源,影响了系统的正常运行;
  • 写操作异步后,不影响主流程,允许适当延迟;

第二层:异步的外功心法

本文提到了四种异步方式:

  • 线程池模式

  • 本地内存 + 定时任务

  • MQ 模式

  • Agent 服务 + MQ 模式

它们的共同特点是:将写操作命令存储在一个池子后,立刻响应给前端,减少写动作的耗时。任务服务异步从池子里获取任务后执行。

第三层:异步的本质

在笔者看来,异步是更细粒度的使用系统资源的一种方式

在教研课程详情场景里,数据库的资源是固定的,但写操作占据大量数据库资源,导致整个系统的阻塞,但写操作并不是最核心的业务流程,它不应该占用那么多的系统资源。

不能为了异步而异步,无论是使用线程池,还是本地内存 + 定时任务 ,亦或是 MQ ,对数据库资源的使用都需要在合理的范围内,否则异步就达不到我们想要的效果。

参考:

有价值的评论:

异步是让系统的局部的资源使用增加了弹性和可缓冲性,而不是说把资源给更细化了。是把一些硬连接给变成可以相对滑动的弹性连接,就好像很多人去发快递,并不需要自己亲自去跑到收货人那里去,只是把包裹交给一个快递网点,然后它就返回了。如果它感兴趣后续的结果,后面的系统也可以在将来给它发送通知。

观看记录属于动态数据,跟数据库保存的用户信息、课程信息静态数据不同,静态数据往往对数据实时性、一致性要求很高,动态数据则不同。
对于这种爆发式增长的动态数据,不管是用本地文件、MQ还是自己内存缓存,本质上都是用了一个池子,选用一个合适的组件就可以,数据库采用读写分离、分库分表、批量插入等方式,数据库引擎也要正确设置。
但是,绝对不能用.net 的异步操作,把请求丢给线程池来处理,很快线程池就耗尽了、程序卡死。
很早我们使用C++去开发一些网络服务器时,给团队定了一个基本原则,在程序运行过程中不允许动态去创建内核对象(socket除外),不允许去new一块内存。

其他文章:


概念:

在异步模型中,允许同一时间发生(处理)多个事件。程序调用一个耗时较长的功能(方法)时,它并不会阻塞程序的执行流程,程序会继续往下执行。当功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果(如果有返回值或需要返回值时)。

比如,你和你的朋友决定一起做一顿午餐。“异步”就是你对朋友说:“你去商店买意大利面,回来的时候告诉我一声,然后一起做午餐。在你买意大利面的同时,我去准备番茄酱和饮料。”

而“线程”是:“你烧水,我加热番茄酱。当水烧开了,告诉我,我把意大利放进去。当番茄酱热了,你可以把奶酪添加进去。当两者都完成了,就可以坐下来一起吃晚餐。”在线程的示例中,我们可以看到“When,Do”的事件顺序,而这些顺序代表着每个人(线程)的指令集集合的顺序。

上述示例可以看出,多线程是与具体的执行者相关的,而异步是与任务相关的

多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码,可以实现线程间的切换执行。

异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。

多线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

所以本质上,异步和多线程并不是一个同等关系,异步是最终目的,多线程只是实现异步的一种手段。

如何选择

面对多线程和异步,我们该如何选择呢?其实,通常情况下选择的依据是主要取决于性能。

那么,同步/异步与单线程/多线程之间的所有组合,哪种模型表现更好?

简而言之,对于具有大量 I/O 操作和不同计算的大规模应用程序,使用异步多线程有利于充分利用计算资源,并且能够照顾到非阻塞函数。这也是所有操作系统所采用的线程模型。

编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与正常的思维方式有些出入,而且难以调试。而多线程的使用(滥用)会给系统带来上下文切换的额外负担,并且线程间的共享变量可能造成死锁。

因此在实现这两种模式时,往往需要处理资源竞争、死锁、共享资源和回调事件等问题。


多线程只是异步编程的一种实现形式,单线程也可以实现异步(协程)

比如,我们可以使用同一个线程,在每个时间点,或每个事件后来执行异步任务(Future),从而实现异步,这就是单线程实现异步的方法

如 JavaScript 处理单线程异步调用的方法

Js 实现异步是通过一个执行栈与一个任务队列来完成异步操作的,所有同步任务都是在主线程上执行的,形成执行栈,任务队列中存放各种事件回调(也可以称作消息),当执行栈中的任务处理完成后,主线程就开始读取

任务队列中的任务并执行,不断往复循环

参考:有关单线程如何实现异步?

 

posted @ 2022-07-13 11:06  strive-sun  阅读(92)  评论(0编辑  收藏  举报