我使用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的異步解決方案,我沒有找到?
謝謝。
我在相同的情況下想知道同樣的事情。對於類似Facebook應用程序的應用程序而言,對應用程序的許多請求會進行外部服務調用,異步頁面處理似乎可以提供更好的吞吐量。我很好奇Ruby on Rails如何比較。 – 2009-12-13 06:02:44
PHP可以對其他服務執行異步請求,但始終佔用線程/進程處理當前請求。所以,這隻對多個外部服務呼叫有益。 – 2009-12-31 08:08:43