一、什么是同步和异步?
同步(英语:Synchronization),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象。说白了就是多个任务一个一个执行,同一时刻只有一个任务在执行。
异步(英语:Asynchronization),指的是让CPU暂时搁置当前请求的响应,处理下一个请求,当通过轮询或其他方式得到回调通知后,开始运行。多线程将异步操作放入另一线程中运行,通过轮询或回调方法得到完成通知,但是完成端口,由操作系统接管异步操作的调度,通过硬件中断,在完成时触发回调方法,此方式不需要占用额外线程。
二、在ASP.NET MVC项目中我们应该何时的使用异步控制器?
2.1、ASP.NET MVC 中为什么需要使用异步呢?
IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该线程不能对另一个请求提供服务,如果请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503繁忙状态。如果是处理一些高延迟,例如网络操作,这样的线程大多数只是等待状态大部分时间是不做任何事情的,这样的线程就可以使用异步编程更好的充分利用。
三、同步和异步使用场景
场景描述一:如果某个请求生成一个需要两秒钟来完成的网络调用,则该请求无论是同步执行还是异步执行都需要两秒钟。 但是,在异步调用的过程中,服务器在等待第一个请求完成的过程中不会阻塞对其他请求的响应。 因此,当有许多请求调用长时间运行的操作时,异步请求可以防止出现请求排队的情况。
场景描述二:假设我有三个操作,分别耗时500, 600和700毫秒。采用同步调用的话,总共的响应时间将会稍微超过1800毫秒。然而,如果是异步调用(并发),总共响应时间将会稍微超过700毫秒,因为那是最长的任务/操作的持续时间。因此:当一个action必须执行多个独立的长期运行的操作时,异步action方法是很有用的。
3.1、在满足以下条件时使用同步管线:
1)、操作很简单或运行时间很短。
2)、简单性比效率更重要。
3)、此操作主要是 CPU 操作而不是包含大量的磁盘或网络开销的操作。 对 CPU 绑定操作使用异步操作方法未提供任何好处并且还导致更多的开销。
3.2、在满足以下条件时使用异步管线:
1)、操作是网络绑定的或 I/O 绑定的而不是 CPU 绑定的。
2)、测试显示阻塞操作对于网站性能是一个瓶颈,并且通过对这些阻塞调用使用异步操作方法,IIS 可对更多的请求提供服务。
并行性比代码的简单性更重要。
3)、您希望提供一种可让用户取消长时间运行的请求的机制。
四、Q&A环节
4.1、既然异步可以大大提供应用程序的响应能力?那么ASP.NET MVC 如果全部用异步控制器(Async Controller),会有什么效果?会成为高吞吐量,高并发的网站么?
仅仅只是把代码加个async事实上不会带来任何性能的提升,必须在需要异步的地方(IO)异步执行才能真正提升吞吐量。异步Controller多用于I/O密集型操作,比如读写数据,且操作之间较为独立;而CPU密集型操作则不适用与异步——无论你是异步处理还是同步处理,最终CPU都会被顶满。所以异步操作确实可以达到提高并发数的效果,但具体还是要看你把它用在哪里。全部使用异步Controller并不会绝对达到提高站点性能的作用。
六、参考文献
看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
ASP.NET MVC 如果全部用异步 Controller,会有什么效果?会成为高吞吐量,高并发的网站么?