一个好的多线程 Python Web 服务器?

13

我正在寻找一个Python Web服务器,它可以使用多线程而不是多进程(例如Apache下的mod_python)。我希望它是多线程的,因为我想要一个内存中的对象缓存,用于多个HTTP线程。我的Web服务器执行大量昂贵的任务,并计算一些大型数组,需要缓存在内存中供将来使用,以避免重新计算。这在多进程Web服务器环境中是不可能的。将这些信息存储在memcache中也不是一个好主意,因为数组很大,将它们存储在memcache中会导致从memcache中反序列化数据,除IPC的额外开销外。

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

11个回答

16

CherryPy。以下是该网站列出的功能:

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

7
考虑重新设计你的方案。在Web服务器中维护如此多的状态可能是一个不好的想法。采用多进程方式可以更好地提高稳定性。
是否有其他方法来共享不同进程之间的状态?可以考虑使用服务、数据库或索引等方式。
似乎在内存中维护大量数据,并依赖于单个多线程进程来处理所有请求,不是你的应用程序的最佳设计或架构。

2
一个类似数据库的后端比线程间共享数据要好得多。简单的RESTful交互可以更轻松地管理Web事务和“一些大数组”之间的关系。 - S.Lott

6

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

twistd web --wsgi=your.wsgi.application

3
不知道您正在开发什么网站以及预期负载是多少,所以很难给出一个确定的答案。如果需要毫秒级别的性能,则必须将数组保留在内存中。但是,可能并非如此,您可以采用其他方法。数据在数组中的使用模式可能会影响您做出的选择。您可能不需要一次访问整个数组中的全部数据,因此可以将数据分成较小的块,并将这些块放入缓存中,而不是放入一个大块中。根据您的数组数据需要更新的频率,您可以在memcached、本地数据库(Berkley、SQLite、小型MySQL安装等)或远程数据库之间进行选择。对于较为频繁的更新,建议使用memcached;对于每小时一次左右的更新,建议使用本地db;对于每天一次左右的更新,建议使用远程db。另外要考虑的一点是缓存失效后的情况。如果50个客户端突然出现缓存失效,并且同时开始重新生成那些昂贵的数组,则您的服务器可能会迅速降至8086级别。因此,您必须考虑如何处理缓存失效的情况。有很多文章介绍如何从缓存失效中恢复过来。希望这些信息对您有所帮助。

2

虽然不支持多线程,但Twisted可能满足您的需求。


如果不使用多线程,我如何将对象存储到缓存中并在多个HTTP请求之间使用它们? - NeoAnderson
这是一个使用select的异步编程框架。http://twistedmatrix.com/projects/core/documentation/howto/async.html - Alex Coventry

2
也许你在使用Python的BaseHttpServer实现时遇到了问题。它没有理由会“卡住”,使用BaseHttpServerthreading实现一个简单的线程化服务器不应该难。
此外,参考http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer上有关使用HTTPServerThreadingMixIn实现简单多线程服务器的内容。

2
你可以选择使用一个分布式缓存,每个进程都能访问到,memcached 就是一个显而易见的例子。

更好的是,Python应用程序可以使用完整的HTML页面填充Memcached,并且具有前端服务器(如nginx)从中提取,在缓存失败或POST请求时仅在调用Web应用程序(通过FastCGI)时。 - Javier

2

过去,web.py让我感到很高兴。建议考虑尝试一下。

但是看起来进行架构重新设计可能是正确的解决方案,尽管更加昂贵。


1

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

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


1

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

我的解决方案是将服务器移植到 Pylons (http://pylonshq.com/)。移植非常容易,并且一个好处是使用 Pylons 很容易创建 GUI,因此我能够在基本上是后台进程的东西上添加状态页面。

我会这样总结 Pylons:

  • 它类似于 Ruby on Rails,旨在使 Web 应用程序部署变得非常简单
  • 它的默认模板语言 Mako 很好用
  • 它使用一种非常方便的 URL 路由系统
  • 对于我们而言,性能不是问题,因此我无法保证 Pylons 是否能够满足您的需求
  • 您可以将其与 Apache 和 Lighthttpd 一起使用,但我没有尝试过
我们也使用Twisted运行应用程序,并对其感到满意。Twisted具有良好的性能,但我发现Twisted的单线程/延迟到线程编程模型相当复杂。它有很多优点,但不适合简单的应用程序。
祝你好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接