瓶子处理没有并发的请求吗?

时间:2014-11-14 04:50:28

标签: python bottle

起初,我认为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
}

1 个答案:

答案 0 :(得分:14)

并发不是您的Web框架的一项功能 - 它是您用来服务它的Web服务器的一项功能。由于Bottle符合WSGI,因此意味着您可以通过任何WSGI服务器提供Bottle应用程序:

  • wsgiref(Python stdlib中的引用服务器)不会给你带来并发性。
  • CherryPy通过线程池调度(同时请求的数量=它使用的线程数)。
  • nginx + uwsgi为每个进程提供多进程调度多个线程。
  • Gevent为您提供轻量级协同程序,在您的使用案例中,如果您的应用程序主要是IO或数据库,在Linux上 - 在Linux上 - 在Windows上它只能处理1024个同时打开的套接字 - 可轻松实现C10K +界。

后两者可以提供大量的同时连接。

根据http://bottlepy.org/docs/dev/api.html,如果没有给出具体说明,bottle.run会使用wsgiref为您的应用程序提供服务,这就解释了为什么它只能一次处理一个请求。