据我所知,与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位
答案 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
。