2014-11-14 9 views
6

In un primo momento, penso Bottiglia gestirà le richieste contemporaneamente, così ho scritto il codice di prova sotto:La bottiglia gestisce le richieste senza concorrenza?

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) 

allora io uso jmeter richiedere /test URL con 10 thread loop 20 volte.

Successivamente, /status mi dà {"numbers": 200}, che sembra che quella bottiglia non gestisca le richieste contemporaneamente.

Ho frainteso qualcosa?

UPDATE

ho fatto un altro test, credo si possa dimostrare che si occupano bottiglia con le richieste di uno ad uno (senza concorrenza). Ho fatto un piccolo cambiamento alla funzione test:

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

E quando accedo /test due volte in un browser ottengo:

{ 
    "t2": 1415941221.631711, 
    "t1": 1415941216.631761 
} 
{ 
    "t2": 1415941226.643427, 
    "t1": 1415941221.643508 
} 
+0

'200' è il codice HTTP per il segnale OK http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – Nilesh

+0

@Lafada Oh, lascia che sia più chiaro,'/status' mi dà ' {"numeri": 200} ' – WKPlus

+0

ora possiamo dare una risposta corretta :) – Nilesh

risposta

12

concorrenza non è una funzione del vostro framework web - è un funzione del server web che usi per servirlo. Dal momento che Bottle è WSGI-compliant, significa che è possibile servire applicazioni bottiglia attraverso qualsiasi server WSGI:

  • wsgiref (server di riferimento nel stdlib Python) vi darà alcuna concorrenza.
  • CherryPy invia un pool di thread (numero di richieste simultanee = numero di thread che sta utilizzando).
  • nginx + uwsgi fornisce la spedizione multiprocesso e più thread per processo.
  • Gevent ti offre coroutine leggere che, nel tuo caso d'uso, possono facilmente ottenere C10K + con un carico di CPU molto ridotto (su Linux - su Windows può gestire solo 1024 socket simultanei aperti) se l'app è per lo più IO o database- limite.

Questi ultimi due possono servire un numero elevato di connessioni simultanee.

Secondo http://bottlepy.org/docs/dev/api.html, quando non vengono fornite istruzioni specifiche, bottle.run utilizza wsgiref per servire l'applicazione, il che spiega perché gestisce solo una richiesta alla volta.

+0

Grazie per la risposta. L'altro giorno mi è stato chiesto del problema della concomitanza della bottiglia in un'intervista, vorrei averlo letto prima. – cizixs

Problemi correlati