2009-11-19 32 views
5

我使用ASP.NET。恕我直言,ASP.NET中的異步編程支持很漂亮。也就是說,我們可以使用BeginXXXX/EndXXXX對方法來提高資源密集型任務的可伸縮性。爲什麼只有ASP.NET有異步編程模型?

例如,一個操作需要從數據庫獲取大量數據並將其呈現在響應網頁上。如果我們有這個操作同步。處理此請求的線程將佔用整個頁面生命週期。由於線程資源有限,因此以異步方式使用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的異步解決方案,我沒有找到?

謝謝。

+0

我在相同的情況下想知道同樣的事情。對於類似Facebook應用程序的應用程序而言,對應用程序的許多請求會進行外部服務調用,異步頁面處理似乎可以提供更好的吞吐量。我很好奇Ruby on Rails如何比較。 – 2009-12-13 06:02:44

+0

PHP可以對其他服務執行異步請求,但始終佔用線程/進程處理當前請求。所以,這隻對多個外部服務呼叫有益。 – 2009-12-31 08:08:43

回答

4

我對您的問題沒有明確的答案,但我可以做出有根據的猜測。

諸如PHP和Ruby之類的系統設計爲非常獨立於平臺,而ASP.NET則深深地集成到Windows平臺中。另外,PHP更像老式的ASP,具有線性的開始到結束流程。

完整的ASP.NET風格的異步頁面不僅需要線程,還需要使用本地異步I/O來發揮最大的影響力。異步I/O是特定於操作系統的功能。異步頁面也依賴於頁面生命週期的概念,這是線性流式的風格。如果沒有頁面生命週期,將異步調用的結果與頁面的其他部分進行集成變得更加困難。

只是我的兩美分,YMMV。

相關問題