Python CherryPy与并发

Python CherryPy与并发,python,concurrency,wsgi,cherrypy,Python,Concurrency,Wsgi,Cherrypy,我使用CherryPy是为了通过WSGI为python应用程序提供服务 我试着对其进行基准测试,但似乎CherryPy只能处理10个请求/秒无论我做什么。 建立了一个简单的应用程序,暂停3秒,以便准确地确定发生了什么。。。我可以确认10 req/sec与python脚本使用的资源无关 __ 有什么想法吗?默认情况下,CherryPy的内置HTTP服务器将使用一个包含10个线程的线程池。如果仍然使用默认值,可以尝试在配置文件中增加此值 [global] server.thread_pool = 3

我使用CherryPy是为了通过WSGI为python应用程序提供服务

我试着对其进行基准测试,但似乎CherryPy只能处理10个请求/秒无论我做什么。

建立了一个简单的应用程序,暂停3秒,以便准确地确定发生了什么。。。我可以确认10 req/sec与python脚本使用的资源无关

__


有什么想法吗?

默认情况下,CherryPy的内置HTTP服务器将使用一个包含10个线程的线程池。如果仍然使用默认值,可以尝试在配置文件中增加此值

[global]
server.thread_pool = 30
  • 或者

您的客户端需要实际读取服务器的响应。否则,套接字/线程将保持打开/运行,直到超时和垃圾回收


使用行为正确的客户端,您将看到您的服务器也会正常工作。

这对我来说也是非常令人困惑的。文档中说CherryPy将根据观察到的负载自动扩展其线程池。但我的经验是,它不会。如果您的任务可能需要一段时间,同时也可能几乎不使用任何CPU,那么您需要根据预期负载和目标响应时间估计
线程池的大小

例如,如果平均处理请求需要1.5秒,并且您希望每秒处理50个请求,那么您的线程池中需要75个线程来处理您的期望

在我的例子中,我通过
多处理
模块将繁重的工作委托给其他进程。这使得主CherryPy进程和线程处于空闲状态。但是,CherryPy线程仍将被阻止,等待委托的
多处理进程的输出。因此,服务器需要
线程池中有足够的线程来处理新请求

我最初的想法是
线程池
不需要大于
多处理
池工作线程大小。但事实证明,这也是一个被误导的假设。无论如何,CherryPy线程将保持阻塞状态,即使
多处理池中有可用容量

另一个被误导的假设是阻塞和低性能与Python GIL有关。事实并非如此。在我的例子中,我已经通过
多处理
完成了工作,并且仍然需要一个
线程池
,其大小取决于平均时间和每秒所需请求的目标。提高线程池大小解决了这个问题。虽然它看起来像一个错误的补丁

对我来说简单的解决方法:

cherrypy.config.update({
    'server.thread_pool': 100
})

@diatoid:非常感谢!顺便说一句,我认为cherrypy是为了支持尽可能高的请求/秒数量而构建的。cherrypy尝试设置正常的默认值,在我的笔记本电脑上产生大约1200请求/秒的最大值。但是,这些基准测试请求不会每次花费3秒钟。你的站点的现实应该在中间的某个地方;如果您真正的请求每次需要3秒钟,那么您可能做错了什么;)请求需要3秒钟,因为它们正在等待从其他地方收集信息。在等待的时候,我没有使用任何资源!那么,为什么我必须让我的机器闲置,而我可以同时处理更多的请求呢;对于任何Web应用程序,都要保持套接字打开,它使用文件描述符和临时端口。在CherryPy中,每个子连接在其生命周期内都绑定到一个线程,因此您还使用一个工作线程(以及它的1MB堆栈大小和处理每个请求所需的任何堆对象)。所以你有一个选择:1)增加线程数量,2)重新设计应用程序以返回202 Accepted并轮询答案(这也会释放套接字),或3)使用异步Web服务器(然后解决延迟问题而不是吞吐量问题)。CherryPy根据需要增加工作线程的数量
thread\u pool=10
是初始线程数。嘿,只是一个友好的提示-如果diatoid的答案是正确的,您想将其标记为已接受吗?:)假设客户表现良好,您将面临“缓慢的loris”攻击。