使用CherryPy的瓶子在调用相同的端点时不会表现出多线程

时间:2015-06-01 17:42:11

标签: python multithreading cherrypy bottle

据我所知,与CherryPy服务器一起使用时,Bottle应具有多线程功能。我有一个简单的测试程序:

from bottle import Bottle, run
import time

app = Bottle()

@app.route('/hello')
def hello():
    time.sleep(5)

@app.route('/hello2')
def hello2():
    time.sleep(5)

run(app, host='0.0.0.0', server="cherrypy", port=8080)

当我通过打开2个标签并同时刷新它们来调用localhost:8080 / hello时,它们不会同时返回,但其中一个在5秒后完成,另一个在5个之后完成更多秒。

但是当我在一个标签中调用/ hello而在另一个标签中调用/ hello2时,它们同时完成。

为什么当两次调用相同的终点时,Bottle不会表现出多线程?有没有办法让它多线程?

Python版本:2.7.6

瓶子版本:0.12.8

CherryPy版本:3.7.0

操作系统:试用Ubuntu 14.04 64-Bit& Windows 10 64位

2 个答案:

答案 0 :(得分:0)

几乎可以肯定,您的浏览器正在序列化请求。尝试使用两个不同的,或更好的真正的客户端。它不会使用curl为我重现。

答案 1 :(得分:0)

我已经遇到了这种回答one question的行为,这让我感到困惑。如果你想搜索相关的问题,列表会继续下去。

嫌疑人是一些不正确的服务器端处理Keep-Alive,HTTP流水线,缓存策略等。但实际上与服务器端无关。由于浏览器缓存实现(Firefox,Chromium),来自同一URL的并发请求被序列化。 The best answer我在直接搜索bugtrackers之前找到了,说:

  

Necko的缓存每个缓存条目只能处理一个编写器。因此,如果您对同一个URL发出多个请求,则第一个请求将打开缓存条目进行写入,后一个将阻止缓存条目打开,直到第一个完成。

的确,如果你在Firebug或DevTools中禁用缓存,效果就不会持久。

因此,如果您的客户不是浏览器,例如API,则忽略该问题。否则,如果您确实需要从一个浏览器向同一URL(正常请求或XHR)执行并发请求,请添加随机查询字符串参数以使请求URL唯一,例如http://example.com/concurrent/page?nocache=1433247395