【问题标题】:Why only ASP.NET have asynchronous programming model?为什么只有 ASP.NET 有异步编程模型?
【发布时间】:2010-12-18 04:32:58
【问题描述】:

我使用 ASP.NET。恕我直言,ASP.NET 中的异步编程支持很漂亮。也就是说,我们可以使用 BeginXXXX/EndXXXX 对方法来提高资源密集型任务的可伸缩性。

例如,一项操作需要从数据库中获取大量数据并将其呈现在响应网页上。如果我们有这个操作同步。处理这个请求的线程将被占用整个页面生命周期。由于线程是有限的资源,因此最好以异步方式使用 I/O 进行编程操作。也就是说,ASP.NET 将分配线程来调用带有回调函数的 BeginXXXX 方法。线程调用 BeginXXXX 立即返回并可安排处理其他请求。工作完成后,回调函数被触发,ASP.NET 将调用 EndXXXX 以获取实际响应。

这种异步编程模型可以充分利用线程资源。尽管 ThreadPool 有限制,但它实际上可以处理更多的请求。但是,如果我们以同步方式编程,并且每个请求都需要冗长的 I/O,则并发请求不会超过线程池的大小。

最近,我有机会探索其他 Web 开发解决方案,例如 PHP 和 Ruby on Rails。令我惊讶的是,这些解决方案没有异步编程模型的对应物。在整个生命周期中,每个请求都由一个线程或进程处理。即在发送最后一位响应之前,线程或进程已被占用。

有一些类似于异步(http://netevil.org/blog/2005/may/guru-multiplexing)的东西,但基线是总是有一个线程或进程被请求占用。这不像 ASP.NET。

所以,我想知道:为什么这些流行的 Web 解决方案没有像 ASP.NET 这样的异步编程模型?为什么只有 ASP.NET 演变为使用异步方法?

是因为 PHP 和 Ruby-on-Rails 主要部署在 Linux 中吗?而且 Linux 不会像 Microsoft Windows 那样遭受进程/线程性能损失?

或者,我还没有找到针对 PHP 和 Ruby-on-Rails 的异步解决方案吗?

谢谢。

【问题讨论】:

  • 我处于同样的情况,想知道同样的事情。对于像 Facebook 应用程序这样的应用程序,应用程序的许多请求都会进行外部服务调用,异步页面处理似乎可以提供更好的吞吐量。我很好奇 Ruby on Rails 会如何比较。
  • PHP 可以对其他服务进行异步请求,但是处理当前请求的线程/进程总是被占用。因此,这仅对多个外部服务调用有益。

标签: php asp.net ruby-on-rails asynchronous


【解决方案1】:

我对你的问题没有明确的答案,但我可以做出有根据的猜测。

PHP 和 Ruby 等系统被设计为非常独立于平台,而 ASP.NET 则深度集成到 Windows 平台中。此外,PHP 更像是老式的 ASP,具有线性的、从头到尾的流程。

完整的 ASP.NET 风格的异步页面不仅需要线程,还需要使用本机异步 I/O 以发挥最大影响。异步 I/O 是一种特定于操作系统的功能。异步页面还依赖于页面生命周期的概念,这是对线性流样式的厌恶。如果没有页面生命周期,将异步调用的结果与页面的其余部分集成起来会变得更加困难。

只要我的两分钱,YMMV。

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 2015-07-10
    • 2016-04-13
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多