同步 HTTP 处理程序和异步 HTTP 处理程序之间的性能差异
Posted
技术标签:
【中文标题】同步 HTTP 处理程序和异步 HTTP 处理程序之间的性能差异【英文标题】:Performance difference between Synchronous HTTP Handler and Asynchronous HTTP Handler 【发布时间】:2011-10-29 10:16:14 【问题描述】:同步 HTTP 处理程序和异步 HTTP 处理程序之间是否存在性能差异? IHttpHandler vs IHttpAsyncHandler
为什么选择一个而不是另一个?
有什么好处?
【问题讨论】:
【参考方案1】:除了管理另一个线程之外,没有性能差异。
同步更容易编码。您发送请求并且线程冻结,直到返回响应。然后您可以用相同的方法处理响应和错误。它易于阅读和调试。如果您在 GUI 线程中运行此代码,如果您没有快速收到响应,Windows 可能会报告您的程序“没有响应”。
如果您不希望线程冻结,请使用异步。当后台任务等待 HTTP 响应时,用户可以继续与程序交互。然后你必须编写代码来管理后台任务,观察它何时完成,处理错误,将这些错误传递回 GUI 线程等。这需要更多的工作,并且更难阅读和调试,但最终是如果做得好,产品质量会更好。
编辑:更正同步方法冻结线程,不一定冻结整个程序。
【讨论】:
您在谈论一般的同步和异步,这太不正确了。就总吞吐量而言,异步在基准测试中表现更好。 诚然,我确实做了一个假设。澄清一下,你是说几个并行的异步请求比几个顺序的同步请求好?我会相信的。单个同步请求与单个异步请求如何? 是的,我说的是并行的几个。至于单一的情况,没有区别。 “整个程序冻结”非常不准确。只有一个线程在等待时被冻结,但数百个其他线程仍处于活动状态以处理其他 HTTP 请求。您混淆了 windows gui 线程和 ASP.NET HTTP 处理线程。 @Samuel,你是对的。我是从单线程与多线程的角度来解决这个问题,而不是异步与同步。【参考方案2】:ASP.NET 使用线程池来处理传入的 HTTP 请求。
当调用 IHttpHandler 时,会使用线程池线程来运行该请求,并使用同一个线程来处理整个请求。如果该请求调用数据库或其他 Web 服务或其他任何可能需要时间的东西,线程池线程将等待。这意味着线程池线程会花时间等待可用于处理其他请求的事物。
相比之下,当一个IHttpAsyncHandler时,存在一种机制允许请求注册一个回调并在请求被完全处理之前将线程池线程返回到池中。线程池线程开始对请求做一些处理。可能会在数据库调用或 Web 服务或其他东西上调用一些异步方法,然后为 ASP.NET 注册一个回调,以便在该调用返回时调用。此时,正在处理 HTTP 请求的线程池线程将返回到池中以处理另一个 HTTP 请求。当数据库调用或任何返回时,ASP.NET 会在新的线程池线程上触发注册的回调。最终结果是您没有线程池线程等待 I/O 绑定操作,您可以更有效地使用线程池。
对于并发性非常高的应用程序(成百上千个真正同时的用户),IHttpAsyncHandler 可以极大地提高并发性。如果用户数量较少,如果您有非常长时间运行的请求(如长轮询请求),仍然会有好处。但是,IHttpAsyncHandler 下的编程比较复杂,所以不应该在不需要的时候使用。
【讨论】:
感谢@Samuel Neff 的回答,能否请您分享链接,我可以在其中阅读更多关于使用差异的信息。需要绝对清楚。以上是关于同步 HTTP 处理程序和异步 HTTP 处理程序之间的性能差异的主要内容,如果未能解决你的问题,请参考以下文章