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?
Vielleicht erhöhen 'Prozesse = 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
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