我使用的是一个由IIS托管的WebApi服务控制器,我试图了解这个体系结构到底是如何工作的:
发布于 2014-05-24 14:02:30
您正在查看的队列大小指定了每个应用程序池(通常映射到一个w3wp工作进程)排队的最大请求数。一旦超过队列长度,503个“服务器太忙”错误将被返回。
在每个工作进程中,可以/将运行许多线程。每个请求运行在工作进程中的一个线程上(我相信,默认情况下每个进程最多有250个线程)。
因此,从本质上说,每个请求都是在自己的线程上处理的(至少是并发的,就像线程获得的一样),但是特定应用程序池的所有线程(通常)都由单个进程管理。这意味着,就请求本身而言,请求实际上是异步执行的。
响应您的评论;如果您启用了会话(您可能会这样做),那么ASP.NET将对请求进行排队,以便为每个请求维护会话的锁。试着在Chrome中点击你的睡眠动作,然后在Firefox中快速反应,看看会发生什么。您应该看到,这两个不同的会话允许并发执行请求。
发布于 2014-05-24 13:55:41
是的,所有请求都将使用CLR线程池中的线程并行执行,但要受限制。关于针对应用程序池设置的队列大小,此限制是IIS开始以503 - Service不可用状态代码拒绝请求。甚至在此之前,您的请求将由IIS/ASP.NET排队,这是因为不能随意创建线程。可以运行的并发请求的数量有限,这是由MaxConcurrentRequestsPerCPU和其他几个参数设置的。对于真正意义上并行执行的1000个线程,您将需要1000个CPU核心。否则,线程将需要时间切片,这将增加系统的开销。因此,线程的数量是有限制的。我相信很难通过一个单一的答案来全面回答你们的问题。您可能需要阅读一点,http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx是一个很好的起点。
https://stackoverflow.com/questions/23845639
复制相似问题