首页 新闻 会员 周边 捐助

谁能详细说一下程序中使用 async await的好处吗?

0
悬赏园豆:5 [已解决问题] 解决于 2022-02-14 10:52

最近看一些开源代码,发现通篇都是 async await,既然都要await了,那异步有什么好处呢?

比如上面这张图,假设每一步都需要10秒,最后这个最起码要20秒才能执行完毕,那既然这样子,为什么还要这么写,不直接使用同步呢?

站在用户等待时间角度来说,它的好处是什么?
站在服务器资源利用角度来说,它的好处又是什么?

因为看到很多很多c#开源代码上,写控制器代码或者是读写数据库的地方都是这种async,await这样子写,感觉如果没有好处,是没有这么多人这么写的。麻烦大家说一下,谢谢

LoveCoder的主页 LoveCoder | 菜鸟二级 | 园豆:218
提问于:2021-01-15 12:33
< >
分享
最佳答案
1

最大的好处是不阻塞线程,await之后的代码要等到结果之后才会继续下一步,但是这个时候,线程是空闲的,可以做别的事情,比如说再接收另一个请求。
异步就是为了提高线程利用率搞出来的。

收获园豆:5
拓拓 | 小虾三级 |园豆:1055 | 2021-01-15 13:19

也就是说,站在请求者的角度来说,时间上并没有什么提升?
但是站在服务器角度来说,它可以处理更多并发?

那么我是不是可以理解为:当await后,它已经把这个耗时得事,交给了另外一个线程而自己却去干了别的事(比如再接收另外一个请求)?
但是另外一个线程,它不也是服务器资源吗?
相当于这件事换了一个人去做,不是吗?
那为什么不是,它自己接着干这件耗时的事,而让另外一个线程去接收新的请求呢?
别怪我钻牛角尖,我是有点理解不了。。。。。麻烦再解答一下,谢谢。

LoveCoder | 园豆:218 (菜鸟二级) | 2021-01-15 13:40

@LoveCoder: 很难理解吗?耗时操作本身可能就有单独的线程或进程甚至是单独的服务器,你的线程可能什么都做不了。比如说,耗时操作是读写数据库,数据库可能根本不在这台服务器上,这种时候,你的线程除了等待做不了任何事情,但如果不等待,他就可以接收下一个请求,可能下一个请求没有耗时操作,很快就完成了。

拓拓 | 园豆:1055 (小虾三级) | 2021-01-15 16:25

@拓拓: 比如读写数据库,哪怕它是在其他服务器,本台服务器 不也得有一个线程去那台服务器取数据,接受数据吗?所以,这个线程不是没事做啊,而是需要负责接收数据不是吗?

LoveCoder | 园豆:218 (菜鸟二级) | 2021-01-15 16:27

@LoveCoder: 这个线程在数据库服务器返回数据之前,就是没事做,数据库返回数据时,才需要接收数据

拓拓 | 园豆:1055 (小虾三级) | 2021-01-15 16:29

@拓拓: 这样子说大概明白了。非常感谢

LoveCoder | 园豆:218 (菜鸟二级) | 2021-01-15 16:32
其他回答(4)
0
楠木大叔 | 园豆:2083 (老鸟四级) | 2021-01-15 12:39

你好。感谢回复。
我大概能理解并发编程的好处,关键是,“await“ 不是要等到结果才会继续执行下一步吗?这个时候它不是也在等待了吗?

支持(0) 反对(0) LoveCoder | 园豆:218 (菜鸟二级) | 2021-01-15 12:41
0

楼上说的对
同意

不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2021-01-15 13:25
0

上个月遇到过这个,当时是我的页面有多个Ajax请求,部分几个有点耗时,我在浏览器监测数据请求的时候,居然发现请求是排队状态, 前面一个不执行完,后面的就在等待。后面深究一番才发现前端的异步只是不阻塞代码的往下执行,但是后端依然还是同步的,是排队的。
后面我就全部改成异步方法了,每个请求互相不阻塞,不互相等待,就快多了。

顾星河 | 园豆:7288 (大侠五级) | 2021-01-15 15:51
0

好处 简化异步的编写。对比以往实现异步的方式就一清二楚。
坏处 调用堆栈上所有的方法都要是 await,兼容性不好。

geass.. | 园豆:1821 (小虾三级) | 2021-01-15 16:33

坏处 调用堆栈上所有的方法都要是 await,兼容性不好。
这个坏处能具体举例吗?我看了很多优秀的开源代码,几乎通篇都是async await,请问一下坏处的体现在于?

支持(0) 反对(0) LoveCoder | 园豆:218 (菜鸟二级) | 2021-01-15 16:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册