2014-11-14 8 views
6

Zuerst denke ich Flasche Anforderungen gleichzeitig behandelt, so schrieb ich dir Testcode:Behandelt Flasche Anfragen ohne Nebenläufigkeit?

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) 

Dann benutze ich jmeter /test url mit 10 Threads zu verlangen Schleifen 20-mal.

Danach /status gibt mir {"numbers": 200}, die wie diese Flasche scheint Anfragen nicht gleichzeitig behandelt.

Habe ich etwas falsch verstanden?

UPDATE

ich einen weiteren Test tat, ich glaube, es die Flasche Deal mit Anfragen einzeln (ohne Gleichzeitigkeit) nachweisen kann. Ich habe ein wenig Änderung der test Funktion:

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

Und wenn ich /test zweimal in einem Browser zugreifen erhalte ich:

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

'200' ist HTTP-Code für OK-Signal http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – Nilesh

+0

@Lafada Oh, lassen Sie mich es klarer machen,'/status' gibt mir ' {"numbers": 200} ' – WKPlus

+0

Jetzt können wir die richtige Antwort geben :) – Nilesh

Antwort

12

Concurrency keine Funktion Ihres Web-Framework ist - es ist ein Funktion des Webservers, mit dem Sie ihn bedienen. Da Bottle WSGI-kompatibel ist, bedeutet dies, Sie Bottle Apps über jeden WSGI-Server dienen kann:

  • wsgiref (Referenzserver in der stdlib Python) gibt Ihnen keine Gleichzeitigkeit.
  • CherryPy sendet über einen Thread-Pool (Anzahl gleichzeitiger Anfragen = Anzahl der verwendeten Threads).
  • nginx + uwsgi gibt Ihnen multiprocess Versand und mehrere Threads pro Prozess.
  • Gevent gibt Ihnen leichte Coroutinen, die in Ihrem Anwendungsfall leicht C10K + mit sehr geringer CPU-Last erreichen (unter Linux - unter Windows kann es nur 1024 gleichzeitig geöffnete Sockets verwalten), wenn Ihre App hauptsächlich IO- oder Datenbank- ist. gebunden.

Die beiden letzteren können eine große Anzahl von gleichzeitigen Verbindungen bedienen.

Nach http://bottlepy.org/docs/dev/api.html, wenn keine spezifischen Anweisungen gegeben, verwendet bottle.run wsgiref, um Ihre Anwendung zu bedienen, weshalb es nur eine Anfrage auf einmal behandelt.

+0

Danke für deine Antwort. Neulich wurde ich bei einem Vorstellungsgespräch über das Flaschengleichheitsproblem gefragt, ich wünschte, ich hätte das vorher gelesen. – cizixs