2014-02-13 11 views
5

Ich versuche, eingehende Web-Anfragen gleichzeitig zu beantworten, während die Verarbeitung einer Anfrage ziemlich lange IO-Aufruf enthält. Ich werde gevent verwenden, da es "non-blocking" sein sollNon-blocking gleichzeitige wsgi-Server

Das Problem, das ich fand, ist, dass Anfragen nacheinander verarbeitet werden, obwohl ich viele Gevent-Threads habe. Aus irgendeinem Grund werden Anfragen von einzelnen grünen Threads bedient.

Ich habe nginx (mit Standard-Konfiguration, die hier nicht relevant ist denke ich), auch ich habe uwsgi und einfache wsgi App, die IO-Blocking-Aufruf als gevent.sleep() emuliert. Hier sind sie:

uwsgi.ini

[uwsgi] 
chdir = /srv/website 
home = /srv/website/env 
module = wsgi:app 
socket = /tmp/uwsgi_mead.sock 
#daemonize = /data/work/zx900/mob-effect.mead/logs/uwsgi.log 
processes = 1 
gevent = 100 
gevent-monkey-patch 

wsgi.py

import gevent 
import time 
from flask import Flask 

app = Flask(__name__) 

@app.route("/") 
def hello(): 
    t0 = time.time() 
    gevent.sleep(10.0) 
    t1 = time.time() 
    return "{1} - {0} = {2}".format(t0, t1, t1 - t0) 

dann gleichzeitig ich (fast) öffnen zwei Registerkarten in meinem Browser, und hier ist, was ich als Ergebnis erhalten:

1392297388.98 - 1392297378.98 = 10.0021491051 
# first tab, processing finished at 1392297378.98 

1392297398.99 - 1392297388.99 = 10.0081849098 
# second tab, processing started at 1392297398.99 

Wie Sie sehen, rufen Sie zuerst die blockierte Ausführung der Ansicht auf. Was habe ich falsch gemacht?

+0

Vielleicht erhöhen 'Prozesse = 1'? –

+1

wenn ich wollte 2-10 Anfragen dann ja, nur mehrere Prozesse oder Threads laufen und rufen Sie es einen Tag. Ich brauche dafür nicht mal Gevent. Aber ich werde tausende gleichzeitig langsame Anfragen bedienen, und ich brauche natürlich eine Event-Schleife dafür und ich mache definitiv etwas falsches ... – Arseniy

+0

Ich denke, Gunicorns gevent (oder eventlet) Arbeiter wird tun, was Sie wollen, obwohl ich haven Ich habe es selbst nicht auf diese Weise benutzt. – dcrosta

Antwort

3

Senden Sie Anfragen mit curl oder irgendetwas anderem als Browser, da der Browser die Anzahl der gleichzeitigen Verbindungen pro Site oder pro Adresse begrenzt. Oder benutze zwei verschiedene Browser.