最近看一些开源代码,发现通篇都是 async await,既然都要await了,那异步有什么好处呢?
比如上面这张图,假设每一步都需要10秒,最后这个最起码要20秒才能执行完毕,那既然这样子,为什么还要这么写,不直接使用同步呢?
站在用户等待时间角度来说,它的好处是什么?
站在服务器资源利用角度来说,它的好处又是什么?
因为看到很多很多c#开源代码上,写控制器代码或者是读写数据库的地方都是这种async,await这样子写,感觉如果没有好处,是没有这么多人这么写的。麻烦大家说一下,谢谢
最大的好处是不阻塞线程,await之后的代码要等到结果之后才会继续下一步,但是这个时候,线程是空闲的,可以做别的事情,比如说再接收另一个请求。
异步就是为了提高线程利用率搞出来的。
也就是说,站在请求者的角度来说,时间上并没有什么提升?
但是站在服务器角度来说,它可以处理更多并发?
那么我是不是可以理解为:当await后,它已经把这个耗时得事,交给了另外一个线程而自己却去干了别的事(比如再接收另外一个请求)?
但是另外一个线程,它不也是服务器资源吗?
相当于这件事换了一个人去做,不是吗?
那为什么不是,它自己接着干这件耗时的事,而让另外一个线程去接收新的请求呢?
别怪我钻牛角尖,我是有点理解不了。。。。。麻烦再解答一下,谢谢。
@LoveCoder: 很难理解吗?耗时操作本身可能就有单独的线程或进程甚至是单独的服务器,你的线程可能什么都做不了。比如说,耗时操作是读写数据库,数据库可能根本不在这台服务器上,这种时候,你的线程除了等待做不了任何事情,但如果不等待,他就可以接收下一个请求,可能下一个请求没有耗时操作,很快就完成了。
@拓拓: 比如读写数据库,哪怕它是在其他服务器,本台服务器 不也得有一个线程去那台服务器取数据,接受数据吗?所以,这个线程不是没事做啊,而是需要负责接收数据不是吗?
@LoveCoder: 这个线程在数据库服务器返回数据之前,就是没事做,数据库返回数据时,才需要接收数据
@拓拓: 这样子说大概明白了。非常感谢
TPL 编程
你好。感谢回复。
我大概能理解并发编程的好处,关键是,“await“ 不是要等到结果才会继续执行下一步吗?这个时候它不是也在等待了吗?
楼上说的对
同意
上个月遇到过这个,当时是我的页面有多个Ajax请求,部分几个有点耗时,我在浏览器监测数据请求的时候,居然发现请求是排队状态, 前面一个不执行完,后面的就在等待。后面深究一番才发现前端的异步只是不阻塞代码的往下执行,但是后端依然还是同步的,是排队的。
后面我就全部改成异步方法了,每个请求互相不阻塞,不互相等待,就快多了。
好处 简化异步的编写。对比以往实现异步的方式就一清二楚。
坏处 调用堆栈上所有的方法都要是 await,兼容性不好。
坏处 调用堆栈上所有的方法都要是 await,兼容性不好。
这个坏处能具体举例吗?我看了很多优秀的开源代码,几乎通篇都是async await,请问一下坏处的体现在于?