1

Asp.net 2 默认有 12 个线程

现在 Asp.Net 4 有 5000 个。我们还需要异步控制器吗?

4

3 回答 3

6

我们还需要异步控制器吗?

是的。异步控制器在您有冗长的操作(例如网络调用)并且您不想为它们独占工作线程的情况下很有用。默认情况下有 5000 个工作线程这一事实并不意味着您必须浪费它们。是因为你是百万富翁,所以你要捐出你的钱吗?不。

显然,如果你没有正确使用异步控制器,它们弊大于利。

于 2011-01-31T11:58:25.390 回答
2

MVC 4/Dev11 使 Async 控制器比以前的版本更具吸引力。添加到该 WebAPI 可以轻松创建 Web 服务。Levi 的评论开始,所以他们不会被错过(在@Darin Dimitrov 的出色回答下)

稍微扩展一下 Darin 的答案 - 异步 I/O 操作(这是 AsyncController 的用途)使用 IOCP 操作,而不是 ThreadPool 线程。这很重要,因为每个 ThreadPool 线程都有一个关联的 1 MB 堆栈(加上其他开销),所以如果您使用 5000 个 ThreadPool 线程,您会因为开销而自动丢失 5 GB 内存!IOCP 延续几乎没有那么多开销,因此可以在任何给定时间处理更多数量的它们。ThreadPool 线程在不再需要时被池化并删除 - 因此您只需要对当前处于活动状态的线程进行打击。但是,如果您使用 ThreadPool 执行大量并发 CPU 密集型工作,您很快就会开始遇到内存问题。

Web 服务的异步通常很有意义 - 请参阅我的数据库调用是否应该是异步的第 II 部分

对于使用异步操作来减少 Web 服务器上阻塞线程数量的数据库应用程序来说,几乎总是完全浪费时间。一个小型 Web 服务器可以轻松地处理比您的数据库后端可以同时处理的更多的并发阻塞请求。相反,请确保您的服务调用在数据库中的成本较低,并将并发执行的请求数限制为您已经测试过的数量,以便能够正常工作并最大限度地提高整体事务吞吐量

请参阅我的数据库调用应该是异步的吗?

于 2012-04-10T20:28:13.147 回答
0

4或5000,没关系,只是一个设置。如果您愿意,可以将其设置为 10 亿,这不会使您的应用程序更具可扩展性。最后你的机器只有 4 个核心(或 8 或 2 个,但不是 5000)。请始终记住,您只能同时运行与内核数相同的线程数。您拥有的超出核心数量的每个线程都只是开销。它将创建更多上下文切换,消耗 CPU 并占用更多内存。

IO(数据库访问、Web 服务、文件访问...)不占用任何 CPU。如果您同步执行此操作,它将在操作期间阻塞一个线程。如果您有一个冗长的操作(5 秒),并且每秒加载 1,000 个请求,您将永久阻塞 5,000 个线程。所以你已经饿死了线程池(设置为 5,000)。但更糟糕的是,您将使用上下文切换破坏您的处理。如果异步执行,则不会阻塞任何线程,不占用资源,并且您可以执行的并发 IO 数量没有限制。

当您负担不起使用异步 IO 重写应用程序的费用时,在线程池中添加更多线程是一种快速而肮脏的 hack。这不是一个干净的解决方案。

于 2012-04-10T13:54:35.183 回答