同步HTTP处理程序和异步HTTP处理程序之间的性能差异

27

同步HTTP处理程序和异步HTTP处理程序之间是否有性能差异?

IHttpHandler与IHttpAsyncHandler

为什么要选择一个而不是另一个?

有哪些好处?

2个回答

30

ASP.NET使用线程池来处理传入的HTTP请求。

当调用IHttpHandler时,会使用一个线程池线程来运行该请求,并且同一个线程将用于处理整个请求。如果该请求调用数据库、其他Web服务或其他需要时间的操作,线程池线程将等待。这意味着线程池线程在等待时浪费了处理其他请求的时间。

相比之下,当使用IHttpAsyncHandler时,存在机制允许请求在完全处理请求之前注册回调并返回线程池线程池。线程池线程开始为请求进行一些处理。可能会对数据库调用或Web服务或其他一些异步方法进行调用,然后为ASP.NET注册回调以在该调用返回时调用。此时正在处理HTTP请求的线程池线程已返回到线程池中以处理另一个HTTP请求。当数据库调用或其他操作返回时,ASP.NET会在新的线程池线程上触发已注册的回调。最终结果是您不必让线程池线程等待I/O限制操作,可以更有效地使用线程池。

对于极高并发的应用程序(数百或数千个真正同时用户),IHttpAsyncHandler可以提供巨大的并发性提升。对于较少数量的用户,如果您有非常长时间的请求(例如长轮询请求),仍然可以获得好处。但是,使用IHttpAsyncHandler进行编程更加复杂,因此在没有真正需要时不应使用。


感谢@Samuel Neff的回答,您能否分享一些链接,让我可以更深入地了解它们的使用差异。我需要完全弄清楚。 - Johnny_D

5

除了管理另一个线程之外,没有性能差异。

同步编码更容易。您发送请求,然后该线程冻结,直到返回响应。然后,您可以在同一方法中处理响应和错误。这很容易阅读和调试。如果您在GUI线程中运行此代码,并且没有迅速收到响应,则Windows可能会报告您的程序“未响应”。

如果您不希望线程被冻结,请使用异步方式。当后台任务等待HTTP响应时,用户可以继续与程序进行交互。然后,您必须编写代码来管理后台任务,观察何时完成,处理错误,将这些错误传回GUI线程等。这需要更多的工作,而且更难以阅读和调试,但是如果正确执行,则可以获得更高质量的产品。

编辑:更正同步方法会冻结线程,而不一定是整个程序。


1
你在一般情况下谈论同步和异步,而且还不正确。在基准测试中,异步在总吞吐量方面表现更好。 - Muhammad Hasan Khan
诚然,我做了一个假设。只是为了澄清,您是说几个并行异步请求比几个顺序同步请求更好吗?我相信这一点。那么对于单个同步请求与单个异步请求呢? - Hand-E-Food
是的,我在谈论同时进行多个操作。对于单个情况没有区别。 - Muhammad Hasan Khan
3
“整个程序冻结”是非常不准确的描述。只有一个线程在等待时被冻结,但数百个其他线程仍然活跃以处理其他HTTP请求。你正在混淆Windows图形界面线程和ASP.NET HTTP处理线程。 - Samuel Neff
@Samuel,你说得对。我是从单线程与多线程的角度来看待这个问题,而不是异步与同步的角度。 - Hand-E-Food

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接