我正在制作基于 Python/Redis 的 API 原型(prototype),并使用 Bottle 提供 JSON,但不幸的是,开箱即用的 Bottle 在负载和高并发性下表现不佳。对真实流量的一些初始测试导致 python 脚本崩溃但没有终止,这意味着 API 没有响应并且没有重新启动*。
目前在性能和文档方面扩展 Python/Redis API 的最佳解决方案是什么。我发现 bottle+greenlet 解决方案的文档很少,而且对于像我这样的 Python 初学者来说实现起来并不容易。我听说 tornado 不错,但它与 Redis 的集成比 Bottle 慢。
*似乎当 bottle 无法将 HTTP 请求的主体发送到客户端时,服务器会出现“[Errno 32] Broken pipe”错误,这似乎是服务器停止工作的一个糟糕理由
您是否已阅读 Bottle docs关于这个主题?
Bottle 在重负载下表现非常好——我用它每天处理数百万个请求——但如果你需要并发或高性能,你一定不要使用它的默认 HTTP 服务器。 (默认情况下,Bottle 仅使用 wsgiref.WSGIServer
,它是单线程的,不适用于任何高性能应用程序。)
在生产中,我使用 mod_wsgi 在 Apache 中运行 Bottle . (其中的 Here's an example。)扩展性非常好; Bottle 本身增加的开销可以忽略不计。
换句话说:你的性能瓶颈不是Bottle造成的,而是你的HTTP服务器造成的。选择可扩展的服务器,您会看到更好的性能。
希望对您有所帮助!
编辑 2015
我发现 Bottle 有其局限性,并且为了获得更高的并发性(每个内核数千 QPS),Bottle 不会这样做。 (瓶颈似乎是 Bottle 使用线程本地存储和 gevent 的 TLS 实现之间的交互。)我没有使用 falcon
,它在高负载下的性能比 Bottle 好得多。