为什么只有ASP.NET有异步编程模型?

Mor*_*eng 5 php asp.net asynchronous ruby-on-rails

我使用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.

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

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

或者,实际上我找不到PHP和Ruby-on-Rails的异步解决方案吗?

谢谢.

Ric*_*kNZ 4

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

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

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

只是我的两分钱,YMMV。