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

WKP*_*lus 8 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)
Run Code Online (Sandbox Code Playgroud)

然后我用jmeter请求/test10个线程循环20次的url.

在那之后,/status给我{"numbers": 200},看起来那瓶不同时处理请求.

我误解了什么吗?

UPDATE

我做了另一个测试,我认为它可以证明瓶子一个接一个地处理请求(没有并发).我对这个test功能做了一些改动:

@app.get("/test")
def test():
    t1 = time.time()
    time.sleep(5)
    t2 = time.time()
    return {"t1": t1, "t2": t2}
Run Code Online (Sandbox Code Playgroud)

当我/test在浏览器中访问两次时,我得到:

{
    "t2": 1415941221.631711,
    "t1": 1415941216.631761
}
{
    "t2": 1415941226.643427,
    "t1": 1415941221.643508
}
Run Code Online (Sandbox Code Playgroud)

Max*_*oel 15

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

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

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

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