起初,我认为Bottle会同时处理请求,所以我写下了测试代码:
import json
from bottle import Bottle, run, request, response, get, post
import time
app = Bottle()
NUMBERS = 0
@app.get("/test")
def test():
id = request.query.get('id', 0)
global NUMBERS
n = NUMBERS
time.sleep(0.2)
n += 1
NUMBERS = n
return id
@app.get("/status")
def status():
return json.dumps({"numbers": NUMBERS})
run(app, host='0.0.0.0', port=8000)
然后我使用jmeter请求10个线程循环20次的/test
url。
之后,/status
给了我{"numbers": 200}
,这似乎是瓶子不能同时处理请求。
我误解了什么吗?
更新
我做了另一个测试,我认为它可以证明瓶子一个接一个地处理请求(没有并发)。我对test
函数做了一点改动:
@app.get("/test")
def test():
t1 = time.time()
time.sleep(5)
t2 = time.time()
return {"t1": t1, "t2": t2}
当我在浏览器中访问/test
两次时,我得到:
{
"t2": 1415941221.631711,
"t1": 1415941216.631761
}
{
"t2": 1415941226.643427,
"t1": 1415941221.643508
}
答案 0 :(得分:14)
并发不是您的Web框架的一项功能 - 它是您用来服务它的Web服务器的一项功能。由于Bottle符合WSGI,因此意味着您可以通过任何WSGI服务器提供Bottle应用程序:
后两者可以提供大量的同时连接。
根据http://bottlepy.org/docs/dev/api.html,如果没有给出具体说明,bottle.run
会使用wsgiref为您的应用程序提供服务,这就解释了为什么它只能一次处理一个请求。