【发布时间】: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