为什么 asnyc await 可以提高web程序的吞吐量
(转网上一段话)
Web程序天生就是多线程的,且web线程都是跑的线程池线程(使用线程池线程是为了避免不断创建、销毁线程所造成的资源成本浪费),而线程池线程可使用线程数量是一定的,尽管可以设置,但它还是会在一定范围内。如此一来,我们web线程是珍贵的(物以稀为贵),不能滥用。用完了,那么其他用户请求的时候就无法处理直接503了。
那什么算是滥用呢?比如:文件读取、URL请求、数据库访问等IO请求。如果用web线程来做这个耗时的IO操作那么就会阻塞web线程,而web线程阻塞得多了web线程池线程就不够用了。也就达到了web程序最大访问数。
此时我们的新异步 async await 横空出世,解放了那些原本处理IO请求而阻塞的web线程(想偷懒?没门,干活了。)。通过异步方式使用相对廉价的线程(非web线程池线程)来处理IO操作,这样web线程池线程就可以解放出来处理更多的请求了。
测试代码:
public class TestAsyncController : ApiController
{
public async void Test(string id)
{
try
{
Trace.WriteLine("before the await,the thread id is " + Thread.CurrentThread.ManagedThreadId);
await GetData(id);
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
Trace.WriteLine("after the await,the thread id id " + Thread.CurrentThread.ManagedThreadId);
Trace.WriteLine("");
} public Task GetData(string id)
{
if (id == null)
{
throw new Exception("抛个异常试试!");
}
Trace.WriteLine("before task.run,the thread id is " + Thread.CurrentThread.ManagedThreadId);
var tk = Task.Run(() =>
{
Trace.WriteLine("in the task.run,the thread id is " + Thread.CurrentThread.ManagedThreadId);
Trace.WriteLine("sleep 3 秒");
Thread.Sleep();
Trace.WriteLine("sleep end");
});
Trace.WriteLine("after task.run,the thread id is " + Thread.CurrentThread.ManagedThreadId);
return tk;
}
}

可以看出来, before the await 和 after the await 后的线程ID不一样,说明执行到GetData()方面里面的Task时,web线程就被解放出来了.
如果去掉async 和 await ,在GetData() 方法里面加上 Task.WaitAll(tk) 结果会是什么呢?
public void Test(string id)
{
try
{
Trace.WriteLine("before the await,the thread id is " + Thread.CurrentThread.ManagedThreadId);
GetData(id);
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
Trace.WriteLine("after the await,the thread id id " + Thread.CurrentThread.ManagedThreadId);
Trace.WriteLine("");
} public Task GetData(string id)
{
if (id == null)
{
throw new Exception("抛个异常试试!");
}
Trace.WriteLine("before task.run,the thread id is " + Thread.CurrentThread.ManagedThreadId);
var tk = Task.Run(() =>
{
Trace.WriteLine("in the task.run,the thread id is " + Thread.CurrentThread.ManagedThreadId);
Trace.WriteLine("sleep 3 秒");
Thread.Sleep();
Trace.WriteLine("sleep end");
});
Task.WaitAll(tk);
Trace.WriteLine("after task.run,the thread id is " + Thread.CurrentThread.ManagedThreadId);
return tk;
}
结果如下:

before the await 和 after the await 的线程ID 永远一样.说明web线程是一样的
为什么 asnyc await 可以提高web程序的吞吐量的更多相关文章
- (转)对《30个提高Web程序执行效率的好经验》的理解
阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...
- 解读30个提高Web程序执行效率的好经验
其实微博是个好东西,关注一些技术博主之后,你不用再逛好多论坛了,因为一些很好的文章微博会告诉你,最近看到酷勤网推荐的一篇文章<30个提高Web程序执行效率的好经验>,文章写得不错,提到一些 ...
- 30条技巧提高Web程序执行效率
尽量避免使用DOM.当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用.使用设置innerHTML的方法来替换document.createElement/append ...
- 30个提高Web程序执行效率的好经验
尽量避免使用DOM.当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用.使用设置innerHTML的方法来替换document.createElement/append ...
- 2.对《30个提高Web程序执行效率的好经验》的理解
摘自:http://www.cnblogs.com/powertoolsteam/archive/2010/07/12/1775933.html 文章中执行代码的消耗时间是怎么计算的,有知道的同学可以 ...
- 如何提高web应用的吞吐量
这篇博文所列举的优化手段是针对比较传统项目,但是想提高系统的吞吐量现在时髦的技术还是那些前后端未分离, 使用nginx当成静态资源服务器去代理我们的静态资源 是谁限制了Throughput? 当我们对 ...
- Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能
Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数 当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存, ...
- .NET WEB程序员需要掌握的技能
本来这个是我给我们公司入职的新人做一个参考,由于 @张善友 老师在他的微信号转了我的这篇文章<<.Net WEB 程序员需要掌握的技能>>,很多人觉得比较有用,说是看了后知道一 ...
- 使用spring等框架的web程序在Tomcat下的启动顺序及思路理清
大牛请绕过,此文仅针对自己小白水平,对web程序的启动流程做个清晰的回顾. 一.使用spring等框架的web程序在Tomcat下的启动流程 1)Tomcat是根据web.xml来启动的.首先到web ...
随机推荐
- CyQ.data MDataTable
前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分享和分布式 ...
- ngrx/store effects 使用总结1:计数器
本教程案例github:https://github.com/axel10/ngrx_demo-counter-and-list angular2+ 的学习成本应该是三大框架中最高的一个,教程及案例稀 ...
- Python之list列表方法详解
# 列表test = [11, 22, 33, 44, 55, 22]# append方法,在test列表末尾增加一个元素# append(self, p_object) 参数:p_object:待添 ...
- Open Live Writer
最近突然发现我的CSDN博客里面的很多内容都被删除了,虽然我没有用CSDN写博了,不过还是想到可能我现在用的博客园写博,如果有些内容敏感的话会不会也会被删除文章或者关掉我的博客.心里满是担心,于是想说 ...
- xml 加载多个properties文件
xml 配置项: <bean id="propertyConfigurer" class="com.boc.icms.archive.util.ExProperty ...
- Spring Mobile——探测客户端设备和系统
Spring Mobile--探测客户端设备和系统 今天闲来无事,浏览Spring的官方网站,发现了Spring Mobile项目,之前也看到过,还以为是针对手机端的项目,并没有细看.今天仔细看了一下 ...
- python中字符串和列表只是汇总
字符串知识汇总 字符串是描述变量的重要信息,其中的应用也是很多,很重要的一点就是StringBuilder.今天我们会为大家介绍一下常用的StringBuilder 1 strip lstrip rs ...
- 【前端单元测试入门04】Karma
Karma 官方介绍 A simple tool that allows you to execute JavaScript code in multiple real browsers. 即一个允许 ...
- SIMD---SSE系列及效率对比
SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...
- Mycat 分片规则详解--一致性hash分片
实现方式:基于hash算法的分片中,算法内部是把记录分片到一种叫做"bucket"(hash桶)的内部算法结构中的,然后hash桶与实际的分片节点一一对应,从此实现了分片.路由的功 ...