为什么 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 ...
随机推荐
- hadoop新增kerberos租户
第一步 在kerberos服务器所在主机 通过kadmin.local,也可以通过kadmin 输入用户密码登录 kadmin.local: addprinc -randkey it1@STARYEA ...
- Android端 高德地图点击得到经纬度
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- 漫谈PID——实现与调参
闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...
- 洛谷 P1025 数的划分
题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输 ...
- react-native导航器 react navigation 介绍
开发环境搭建好之后,想要进一步了解react-native,可以先从react-native官网上的电影列表案例入手: https://reactnative.cn/docs/0.51/sample- ...
- H5页面基于接口实现数据交互
对于现在APP开发来说,目前流行的两个方式是原生和H5.就如同之前业界程序猿争论的BS和CS之争一样,业界对于H5和原生也有不小的争论.对于前者的争论在于PC端,后者在于移动端上体现. 那一个APP适 ...
- 初识Selenium以及Selenium常用工具的简单介绍
一.为什么要学习自动化测试? 在互联网行业中敏捷开发小步快跑,快速迭代,测试环节中回归测试任务大繁琐,手工测试容易漏测,自动化测试可以提高测试效率保证产品质量. 二.学习的层次模型 1.单元自动化测试 ...
- linux下Tomcat 安装后执行startup.sh,出现– Cannot find …bin/catalina.sh
linux下Tomcat 安装后执行startup.sh,出现– Cannot find …bin/catalina.sh 是因为权限不够,执行以下命令就可以: chmod +x startup.sh ...
- canvas---HTML5新特性
画圆及填充文字<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- spring boot jsp页面
相关内容访问: http://www.cnblogs.com/zj0208/p/5985698.html