apache 一个好的多线程 python 网络服务器?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/213483/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 16:53:20  来源:igfitidea点击:

A good multithreaded python webserver?

pythonapachewebservermod-python

提问by NeoAnderson

I am looking for a python webserver which is multithreaded instead of being multi-process (as in case of mod_python for apache). I want it to be multithreaded because I want to have an in memory object cache that will be used by various http threads. My webserver does a lot of expensive stuff and computes some large arrays which needs to be cached in memory for future use to avoid recomputing. This is not possible in a multi-process web server environment. Storing this information in memcache is also not a good idea as the arrays are large and storing them in memcache would lead to deserialization of data coming from memcache apart from the additional overhead of IPC.

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

I implemented a simple webserver using BaseHttpServer, it gives good performance but it gets stuck after a few hours time. I need some more matured webserver. Is it possible to configure apache to use mod_python under a thread model so that I can do some object caching?

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

回答by David Eyk

CherryPy. Features, as listed from the website:

樱桃派。网站上列出的功能:

  • A fast, HTTP/1.1-compliant, WSGI thread-pooled webserver. Typically, CherryPy itself takes only 1-2ms per page!
  • Support for any other WSGI-enabled webserver or adapter, including Apache, IIS, lighttpd, mod_python, FastCGI, SCGI, and mod_wsgi
  • Easy to run multiple HTTP servers (e.g. on multiple ports) at once
  • A powerful configuration system for developers and deployers alike
  • A flexible plugin system
  • Built-in tools for caching, encoding, sessions, authorization, static content, and many more
  • A native mod_python adapter
  • A complete test suite
  • Swappable and customizable...everything.
  • Built-in profiling, coverage, and testing support.
  • 一个快速的、符合 HTTP/1.1 的、WSGI 线程池的网络服务器。通常,CherryPy 本身每页只需 1-2 毫秒!
  • 支持任何其他启用 WSGI 的网络服务器或适配器,包括 Apache、IIS、lighttpd、mod_python、FastCGI、SCGI 和 mod_wsgi
  • 易于同时运行多个 HTTP 服务器(例如在多个端口上)
  • 适用于开发人员和部署人员的强大配置系统
  • 灵活的插件系统
  • 用于缓存、编码、会话、授权、静态内容等的内置工具
  • 原生 mod_python 适配器
  • 完整的测试套件
  • 可交换和可定制...一切。
  • 内置分析、覆盖和测试支持。

回答by Troy Howard

Consider reconsidering your design. Maintaining that much state in your webserver is probably a bad idea. Multi-process is a much better way to go for stability.

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

Is there another way to share state between separate processes? What about a service? Database? Index?

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

It seems unlikely that maintaining a huge array of data in memory and relying on a single multi-threaded process to serve all your requests is the best design or architecture for your app.

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

回答by Glyph

Twistedcan serve as such a web server. While not multithreaded itself, there is a (not yet released) multithreaded WSGI container present in the current trunk. You can check out the SVN repository and then run:

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

twistd web --wsgi=your.wsgi.application

回答by Sam Corder

Its hard to give a definitive answer without knowing what kind of site you are working on and what kind of load you are expecting. Sub second performance may be a serious requirement or it may not. If you really need to save that last millisecond then you absolutely need to keep your arrays in memory. However as others have suggested it is more than likely that you don't and could get by with something else. Your usage pattern of the data in the array may affect what kinds of choices you make. You probably don't need access to the entire set of data from the array all at once so you could break your data up into smaller chunks and put those chunks in the cache instead of the one big lump. Depending on how often your array data needs to get updated you might make a choice between memcached, local db (berkley, sqlite, small mysql installation, etc) or a remote db. I'd say memcached for fairly frequent updates. A local db for something in the frequency of hourly and remote for the frequency of daily. One thing to consider also is what happens after a cache miss. If 50 clients all of a sudden get a cache miss and all of them at the same time decide to start regenerating those expensive arrays your box(es) will quickly be reduced to 8086's. So you have to take in to consideration how you will handle that. Many articles out there cover how to recover from cache misses. Hope this is helpful.

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

回答by johnstok

You could instead use a distributed cache that is accessible from each process, memcachedbeing the example that springs to mind.

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

回答by Alex Coventry

Not multithreaded, but twistedmight serve your needs.

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

回答by Eli Bendersky

Perhaps you have a problem with your implementation in Python using BaseHttpServer. There's no reason for it to "get stuck", and implementing a simple threaded server using BaseHttpServerand threadingshouldn't be difficult.

也许您在 Python 中使用BaseHttpServer. 它没有理由“卡住”,并且使用BaseHttpServer和实现一个简单的线程服务器threading应该不难。

Also, see http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServerabout implementing a simple multi-threaded server with HTTPServerand ThreadingMixIn

另外,请参阅http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer关于实现一个简单的多线程服务器HTTPServerThreadingMixIn

回答by Eli Bendersky

web.py has made me happy in the past. Consider checking it out.

web.py 过去让我很开心。考虑检查一下。

But it does sound like an architectural redesign might be the proper, though more expensive, solution.

但听起来架构重新设计可能是合适的解决方案,尽管成本更高。

回答by user29250

I actually had the same issue recently. Namely: we wrote a simple server using BaseHTTPServer and found that the fact that it's not multi-threaded was a big drawback.

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

My solution was to port the server to Pylons (http://pylonshq.com/). The port was fairly easy and one benefit was it's very easy to create a GUI using Pylons so I was able to throw a status page on top of what's basically a daemon process.

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

I would summarize Pylons this way:

我会这样总结 Pylons:

  • it's similar to Ruby on Rails in that it aims to be very easy to deploy web apps
  • it's default templating language, Mako, is very nice to work with
  • it uses a system of routing urls that's very convenient
  • for us performance is not an issue, so I can't guarantee that Pylons would perform adequately for your needs
  • you can use it with Apache & Lighthttpd, though I've not tried this
  • 它类似于 Ruby on Rails,因为它旨在非常容易部署 Web 应用程序
  • 它的默认模板语言 Mako 非常适合使用
  • 它使用了一个非常方便的路由 url 系统
  • 对我们来说,性能不是问题,所以我不能保证 Pylons 的性能足以满足您的需求
  • 您可以将它与 Apache 和 Lighthttpd 一起使用,尽管我还没有尝试过

We also run an app with Twisted and are happy with it. Twisted has good performance, but I find Twisted's single-threaded/defer-to-thread programming model fairly complicated. It has lots of advantages, but would not be my choice for a simple app.

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

Good luck.

祝你好运。

回答by Eli Courtwright

I use CherryPy both personally and professionally, and I'm extremely happy with it. I even do the kinds of thing you're describing, such as having global object caches, running other threads in the background, etc. And it integrates well with Apache; simply run CherryPy as a standalone server bound to localhost, then use Apache's mod_proxyand mod_rewriteto have Apache transparently forward your requests to CherryPy.

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

The CherryPy website is http://cherrypy.org/

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