async await解析同步异步操作
理解同步和异步:
假设一个服务器只有一个单线程每次只能处理一个请求
场景模拟:
厨房有一个厨师,很多客人都在点鲫鱼汤
鲫鱼汤流程:
1、前期准备,杀鱼,准备辅料(3分钟)
2、烧开水(12分钟),假设每次只能烧一个菜的开水用量
3、煎鱼加开水冲白...起锅(5分钟)
说明:1,2过程可以交换
假设现在是同步操作:
同步的特点就是在执行一个任务时,直至任务完成不能有其他操作。
所以一共需要20分钟。
假设有3个客人同时点这个菜,总共需要60分钟。
如果是异步操作呢?大家都知道烧开水这个工作,在我们加水到热水壶以后按下开关,后面直至水烧开都不需要我们认为参与了,烧开也会自动断开。
同步要求在等待烧水的过程中厨师不能干其他事,只能等待,这个等待的状态被称为线程阻塞。
异步则允许线程在等待执行结果返回前做其他操作
在一个请求内异步(controller内部异步)
厨师可以先烧水之后,马上做步骤1,,所以步骤1,2,只需要12分钟。
那么一道菜总共只需要17分钟。
三道菜一共是51分钟。
这就完了吗?大家一定觉得还有优化空间吧,上述的情况是我在处理第一单的时候,是不能处理第二单的,就是说每个点单之间还是同步的,这样也无法做到效率最大化
现实厨房一个厨师也不会三个菜要51分钟吧。
那最快的当然是能同时做三个菜,也就是说我们响应请求也要是异步的,不用非得一个菜做好再做第二个菜。
也就是一个线程可以异步处理请求(controller层级设置成异步)
大致流程是这样的:
厨师接到三个菜点单,先拿三个水壶烧水(12分钟),烧水的过程中做好三条鱼的准备工作。然后进行三条鱼的制作(15分钟),总共27分钟。这也是贴合实际厨房场景的情况。
烧水这个流程这个可以类比为我们做一个数据库耗时查询,我们把sql提交给mysql数据库,耗时的查询在mysql端完成后返回,在此期间不需要我们参与了。我们可以把
其实不需要我们参与了