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

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

有帮助吗?

解决方案

樱桃Py. 。网站列出的功能:

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

其他提示

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

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

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

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

twistd web --wsgi=your.wsgi.application

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

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

您可以使用可从每个进程访问的分布式缓存, memcached 为例我想起了。

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

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

使用 BaseHttpServer ,也许你的Python实现有问题。它没有理由“卡住”,使用 BaseHttpServer threading 实现一个简单的线程服务器并不困难。

另请参阅 http://pymotw.com/2/BaseHTTPServer/ index.html#module-BaseHTTPServer 关于使用 HTTPServer ThreadingMixIn

实现一个简单的多线程服务器

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

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

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

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

我会这样总结 Pylons:

  • 它与 Ruby on Rails 类似,旨在非常轻松地部署 Web 应用程序
  • 它的默认模板语言 Mako 非常好用
  • 它使用非常方便的路由 url 系统
  • 对于我们来说,性能不是问题,所以我不能保证 Pylons 能够充分满足您的需求
  • 你可以将它与 Apache 和 Lighthttpd 一起使用,尽管我还没有尝试过

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

祝你好运。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top