2008-10-17 76 views
13

我正在尋找一個多線程而不是多進程的python web服務器(比如Apache的mod_python)。我希望它是多線程的,因爲我想有一個內存對象緩存,將被各種http線程使用。我的網絡服務器做了很多昂貴的工作,並計算了一些需要在內存中緩存以供將來使用的大型數組,以避免重新計算。這在多進程Web服務器環境中是不可能的。將這些信息存儲在memcache中也不是一個好主意,因爲數組很大,並且將它們存儲在memcache中會導致來自memcache的數據的反序列化,除了IPC的額外開銷之外。一個好的多線程python web服務器?

我使用BaseHttpServer實現了一個簡單的網絡服務器,它具有良好的性能,但在幾個小時後就會卡住。我需要一些更成熟的網絡服務器。是否可以配置apache在線程模型下使用mod_python,以便我可以做一些對象緩存?

回答

16

CherryPy。特點,從網站上列出:

  • 一個快速,HTTP/1.1兼容,WSGI線程池網絡服務器。通常,CherryPy本身每頁只需要1-2ms!
  • 支持任何其他支持WSGI-Web服務器或適配器,包括Apache,IIS,lighttpd的,mod_python的,Fa​​stCGI的,SCGI,和mod_wsgi的
  • 輕鬆運行(例如,在多個端口)一次
  • 一個多HTTP服務器爲開發和部署都強大的配置系統
  • 靈活的插件系統
  • 內置工具緩存,編碼,會議,授權,靜態內容,還有更多
  • 一個土生土長的mod_python的適配器
  • 一完整的測試套件
  • 可交換和可定製...一切。
  • 內置分析,覆蓋和測試支持。
2

不是多線程的,但twisted可能會滿足您的需求。

+0

如果它沒有多線程,那麼我將如何能夠將對象存儲到緩存中並跨多個http請求使用它們? – NeoAnderson 2008-10-17 19:31:41

+0

這是一個使用select的異步編程框架。 http://twistedmatrix.com/projects/core/documentation/howto/async.html – 2008-10-17 19:44:24

+0

實際上,它是多線程的。請參閱下面的答案。 – Glyph 2008-10-18 03:30:22

2

也許你在使用BaseHttpServer在Python中的實現有問題。沒有理由讓它「卡住」,並且使用BaseHttpServerthreading來實現一個簡單的線程服務器應該不困難。

而且,看到http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer有關實現一個簡單的多線程服務器HTTPServerThreadingMixIn

1

我用的CherryPy個人和職業,我與它非常高興。我甚至會做你描述的東西,比如擁有全局對象緩存,在後臺運行其他線程等等。它和Apache很好地集成在一起。只需將CherryPy作爲綁定到本地主機的獨立服務器運行,然後使用Apache的mod_proxymod_rewrite讓Apache將您的請求透明地轉發給CherryPy。

的CherryPy的網站是http://cherrypy.org/

2

你也可以使用分佈式緩存是可訪問的每個過程,memcached在於彈簧想到的例子。

+0

更好的是,python應用程序可以用完整的HTML頁面播種memcached,並從那裏獲得一個前端服務器(如nginx),僅當緩存失敗或POST請求時調用webapp(通過FastCGI) – Javier 2008-10-17 19:46:47

7

考慮重新考慮您的設計。在你的web服務器中維護這麼多的狀態可能是一個壞主意。多進程是穩定性的更好方式。

是否有另一種方式分享進程之間的狀態?怎麼樣的服務?數據庫?指數?

在內存中維護大量數據並依靠單個多線程進程處理所有請求似乎不太可能,因爲這是您的應用的最佳設計或體系結構。

0

只是爲了當我使用Zope 2.X我讀到Medusa,因爲它是用於平臺的Web服務器指出從東西秋後算賬不同...

若干年前。他們宣稱它在重負載下運行良好,它可以爲您提供您所要求的功能。

3

很難給出明確的答案,不知道你正在做什麼樣的網站以及你期望的負載類型。次要表現可能是一個嚴重的要求,或者可能不是。如果你真的需要保存最後的毫秒,那麼你絕對需要將你的數組保存在內存中。然而,正如其他人所表示的那樣,你很可能不會並且可能與別的東西相處。數組中數據的使用模式可能會影響您所做的選擇。您可能不需要同時訪問數組中的整個數據集,以便將數據分成更小的塊,並將這些塊放入緩存中,而不是一個大塊。根據數組數據需要更新的頻率,您可以在memcached,本地數據庫(berkley,sqlite,小型mysql安裝等)或遠程數據庫之間進行選擇。我會說相當頻繁的更新memcached。一個本地數據庫的日常頻率每小時和遠程頻率的東西。有一點需要考慮的是緩存未命中後會發生什麼。如果50個客戶突然間發現緩存未命中,並且他們都同時決定開始重新生成那些昂貴的陣列,那麼您的盒子將很快減少到8086。所以你必須考慮如何處理這個問題。那裏的許多文章都涵蓋了如何從緩存未命中中恢復。希望這是有幫助的。

6

Twisted可以作爲這樣的網絡服務器。雖然沒有多線程本身,但當前中繼中還有一個(尚未發佈的)多線程WSGI容器。你可以看看SVN倉庫,然後運行:

twistd web --wsgi=your.wsgi.application 
1

我最近實際上有同樣的問題。即:我們使用BaseHTTPServer編寫了一個簡單的服務器,發現它不是多線程的事實是一個很大的缺點。

我的解決方案是將服務器連接到Pylons(http://pylonshq.com/)。該端口相當簡單,一個好處是使用Pylons創建一個GUI非常容易,所以我能夠在基本守護進程的基礎上拋出狀態頁面。

我會總結主塔是這樣的:

  • 它類似於Ruby on Rails的,它的目標是很容易部署Web應用程序
  • 它的默認模板語言,真子,是非常好的工作與
  • 它使用路由的網址是非常方便
  • 對我們的表現是不是一個問題的系統,所以我不能保證主塔將滿足您的需求充分履行
  • 可以使用它與Apache & Lighthttpd,雖然我還沒有嘗試過

我們也運行一個應用程序與扭曲,並與它感到滿意。 Twisted具有良好的性能,但我發現Twisted的單線程/延遲線程編程模型相當複雜。它有很多優點,但不是我選擇一個簡單的應用程序。

祝你好運。

2

web.py讓我開心過去。考慮檢查出來。

但它聽起來像一個建築重新設計可能是適當的,但更昂貴的解決方案。