一个很好的多线程python webserver?

时间:2008-10-17 19:12:39

标签: python apache webserver mod-python

我正在寻找一个多线程的python webserver,而不是多进程(就像apache的mod_python一样)。我希望它是多线程的,因为我希望有一个内存对象缓存,将由各种http线程使用。我的网络服务器做了很多昂贵的事情,并计算了一些需要缓存在内存中的大型数组,以备将来使用,以避免重新计算。这在多进程Web服务器环境中是不可能的。在memcache中存储这些信息也不是一个好主意,因为数组很大并且将它们存储在memcache中会导致来自memcache的数据的反序列化,而不是IPC的额外开销。

我使用BaseHttpServer实现了一个简单的Web服务器,它提供了良好的性能,但在几个小时后就会卡住。我需要一些更成熟的网络服务器。是否可以配置apache在线程模型下使用mod_python,以便我可以进行一些对象缓存?

11 个答案:

答案 0 :(得分:16)

CherryPy。功能,从网站上列出:

  • 一个快速,符合HTTP / 1.1标准的WSGI线程池网络服务器。通常,CherryPy本身每页只需1-2毫秒!
  • 支持任何其他启用WSGI的网络服务器或适配器,包括Apache,IIS,lighttpd,mod_python,FastCGI,SCGI和mod_wsgi
  • 一次轻松运行多个HTTP服务器(例如,在多个端口上)
  • 适用于开发人员和部署人员的强大配置系统
  • 灵活的插件系统
  • 用于缓存,编码,会话,授权,静态内容等的内置工具
  • 原生mod_python适配器
  • 完整的测试套件
  • 可交换和可自定义......一切。
  • 内置分析,覆盖和测试支持。

答案 1 :(得分:7)

考虑重新考虑您的设计。在您的网络服务器中保持这么多状态可能是一个坏主意。多进程是一种更好的稳定方法。

是否有另一种在不同进程之间共享状态的方法?服务怎么样?数据库?指数?

在内存中维护大量数据并依靠单个多线程进程来满足您的所有请求似乎不太可能是您应用的最佳设计或架构。

答案 2 :(得分:6)

Twisted可以作为这样的Web服务器。虽然本身没有多线程,但当前主干中存在一个(尚未发布的)多线程WSGI容器。您可以查看SVN存储库,然后运行:

twistd web --wsgi=your.wsgi.application

答案 3 :(得分:3)

如果不知道您正在使用哪种类型的网站以及您期望的负载类型,很难给出确定的答案。次要性能可能是严重要求,也可能不是。如果你真的需要保存最后一毫秒,那么你绝对需要将你的数组保存在内存中。然而,正如其他人所暗示的那样,很可能你不会并且可以通过别的东西来解决问题。数组中数据的使用模式可能会影响您所做的选择。您可能不需要同时访问阵列中的整个数据集,因此您可以将数据分成更小的块并将这些块放在缓存中而不是一个大块中。根据您的阵列数据需要更新的频率,您可以在memcached,本地db(berkley,sqlite,小型mysql安装等)或远程数据库之间进行选择。我会说memcached经常更新。一个本地数据库,用于每小时和远程频率的每日频率。还要考虑的一件事是缓存未命中后会发生什么。如果50个客户端突然失去了缓存并且所有这些客户端同时决定开始重新生成那些昂贵的阵列,那么您的盒子将很快减少到8086。所以你必须考虑如何处理它。许多文章都介绍了如何从缓存未命中中恢复。希望这有用。

答案 4 :(得分:2)

不是多线程的,但twisted可能会满足您的需求。

答案 5 :(得分:2)

使用BaseHttpServer时,您在Python中的实现可能存在问题。它没有理由“卡住”,使用BaseHttpServerthreading实现一个简单的线程服务器并不困难。

另请参阅http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer,了解如何使用HTTPServerThreadingMixIn

实现简单的多线程服务器

答案 6 :(得分:2)

您可以使用可从每个进程访问的分布式缓存,memcached是您想到的示例。

答案 7 :(得分:2)

web.py过去让我很开心。考虑一下来看看。

但它听起来像是一个建筑重新设计可能是正确的,但更昂贵的解决方案。

答案 8 :(得分:1)

我个人和专业都使用CherryPy,我对它非常满意。我甚至会做你正在描述的事情,例如拥有全局对象缓存,在后台运行其他线程等等。它与Apache很好地集成;只需将CherryPy作为绑定到localhost的独立服务器运行,然后使用Apache的mod_proxymod_rewrite让Apache透明地将您的请求转发给CherryPy。

CherryPy网站为http://cherrypy.org/

答案 9 :(得分:1)

我最近遇到了同样的问题。即:我们使用BaseHTTPServer编写了一个简单的服务器,发现它不是多线程的,这是一个很大的缺点。

我的解决方案是将服务器移植到Pylons(http://pylonshq.com/)。端口相当简单,一个好处是使用Pylons创建GUI非常容易,因此我能够在基本上是守护进程的基础上抛出状态页面。

我会这样总结Pylons:

  • 它类似于Ruby on Rails,因为它旨在轻松部署Web应用程序
  • 它是默认的模板语言,Mako,非常适合与
  • 一起工作
  • 它使用了一个非常方便的路由网址系统
  • 对于我们来说,性能不是问题,所以我不能保证Pylons能够满足您的需求
  • 你可以在Apache& Lighthttpd,虽然我没试过这个

我们还使用Twisted运行应用程序并对此感到满意。 Twisted具有良好的性能,但我发现Twisted的单线程/延迟线程编程模型相当复杂。它有很多优点,但不是我选择简单的应用程序。

祝你好运。

答案 10 :(得分:0)

只是指出与通常的嫌疑人不同的东西......

几年前,当我使用Zope 2.x时,我读到了Medusa,因为它是用于平台的Web服务器。他们宣称它在重载下工作良好,它可以为您提供所要求的功能。