我正在寻找一个多线程的python webserver,而不是多进程(就像apache的mod_python一样)。我希望它是多线程的,因为我希望有一个内存对象缓存,将由各种http线程使用。我的网络服务器做了很多昂贵的事情,并计算了一些需要缓存在内存中的大型数组,以备将来使用,以避免重新计算。这在多进程Web服务器环境中是不可能的。在memcache中存储这些信息也不是一个好主意,因为数组很大并且将它们存储在memcache中会导致来自memcache的数据的反序列化,而不是IPC的额外开销。
我使用BaseHttpServer实现了一个简单的Web服务器,它提供了良好的性能,但在几个小时后就会卡住。我需要一些更成熟的网络服务器。是否可以配置apache在线程模型下使用mod_python,以便我可以进行一些对象缓存?
答案 0 :(得分:16)
CherryPy。功能,从网站上列出:
答案 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中的实现可能存在问题。它没有理由“卡住”,使用BaseHttpServer
和threading
实现一个简单的线程服务器并不困难。
另请参阅http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer,了解如何使用HTTPServer
和ThreadingMixIn
答案 6 :(得分:2)
您可以使用可从每个进程访问的分布式缓存,memcached是您想到的示例。
答案 7 :(得分:2)
但它听起来像是一个建筑重新设计可能是正确的,但更昂贵的解决方案。
答案 8 :(得分:1)
我个人和专业都使用CherryPy,我对它非常满意。我甚至会做你正在描述的事情,例如拥有全局对象缓存,在后台运行其他线程等等。它与Apache很好地集成;只需将CherryPy作为绑定到localhost的独立服务器运行,然后使用Apache的mod_proxy
和mod_rewrite
让Apache透明地将您的请求转发给CherryPy。
CherryPy网站为http://cherrypy.org/
答案 9 :(得分:1)
我最近遇到了同样的问题。即:我们使用BaseHTTPServer编写了一个简单的服务器,发现它不是多线程的,这是一个很大的缺点。
我的解决方案是将服务器移植到Pylons(http://pylonshq.com/)。端口相当简单,一个好处是使用Pylons创建GUI非常容易,因此我能够在基本上是守护进程的基础上抛出状态页面。
我会这样总结Pylons:
我们还使用Twisted运行应用程序并对此感到满意。 Twisted具有良好的性能,但我发现Twisted的单线程/延迟线程编程模型相当复杂。它有很多优点,但不是我选择简单的应用程序。
祝你好运。答案 10 :(得分:0)