最好的高并发Python / Redis服务器

时间:2013-11-05 08:53:37

标签: python performance redis bottle

我正在使用基于Python / Redis的API进行原型设计并使用Bottle提供JSON,但不幸的是,开箱即用的瓶子在负载和高并发性下表现糟糕。对实际流量进行一些初步测试会导致python脚本崩溃而不会终止,这意味着API没有响应,也没有重新启动*。

目前,在性能和文档方面扩展Python / Redis API的最佳解决方案是什么。我发现瓶子+ greenlet解决方案记录不清,而且对于像我这样的Python初学者来说并不容易实现。我听说龙卷风很好但是它与Redis的集成比Bottle的慢。

*似乎当瓶子无法将HTTP请求的主体发送到客户端时,服务器会出现“[Errno 32] Broken pipe”错误,这似乎是服务器停止工作的一个坏理由

3 个答案:

答案 0 :(得分:3)

您是否已阅读有关此主题的Bottle docs

Bottle在重负载下表现非常好 - 我用它来处理每天数百万个请求 - 但是如果你需要并发或高性能,你一定不能使用它的默认HTTP服务器。 (默认情况下,Bottle只使用wsgiref.WSGIServer,它是单线程的,不适用于任何高性能应用程序。)

在制作中,我使用mod_wsgi在Apache中运行Bottle。 (Here's an example。)非常好;瓶子本身增加了可忽略不计的开销。

换句话说:您的性能瓶颈不是由Bottle引起的,而是由HTTP服务器引起的。选择可扩展的服务器,您将看到更好的性能。

希望有所帮助!


2015年编辑

我发现Bottle有其局限性,并且为了获得更高的并发性(每个核心数千QPS),Bottle不会这样做。 (瓶颈似乎是Bottle使用线程本地存储和gevent的TLS实现之间的交互。)我没有使用falcon,并且它在高负载下的性能比Bottle可以好得多。

答案 1 :(得分:1)

如果你是初学者,你不应该从事(扭曲/龙卷风/ gevent / eventlet ......)libs开始。

它将导致你不知道!

如果您需要扩展添加机器并使用负载均衡器平衡负载。

答案 2 :(得分:0)

根据您的应用程序的特定要求,您可能会因尝试执行multithreaded Python WSGIServer而受益。 (Here's its page在我自己的博客上。)

它是wsgiref.WSGIServer的替代品,因此您只需更改即可将其与Bottle配合使用。

基本上,它有点像Apache的worker MPM(但只有一个进程):每个请求都将由来自N个预分配线程池的自己的线程处理。

我发现它在我的Bottle应用程序中需要并发的情况下很有用,但我不想使用Apache或引入任何其他重要的服务器依赖项。

以下是一个例子:

import bottle
import time

app = bottle.Bottle()

@app.route('/')
def foo():
    time.sleep(2)
    return 'hello, world!\n'

app.run(server=MTServer, host='0.0.0.0', port=8080, thread_count=3)

# Here, app is nonblocking; it will handle up to 3 requests concurrently.
# A 4th concurrent request would block until one of the first 3 completed.

如果您试一试,请告诉我,以及它是如何运作的。 (欢迎提出意见和建议。谢谢!)

(将此作为单独的答案添加,因为它比我以前的答案更加激进。)