Lange Abfragen in Python mit Flask
Ich versuche zu tun, long-polling mit JQuery und Python unter dem Flask-Framework.
Geleistet zu long-polling, bevor in PHP, ich habe versucht, darüber zu gehen, es auf die gleiche Weise:
Einem Skript/die Funktion, die hat eine while(true) - Schleife, prüft periodisch ändert zB.alle 0,5 Sekunden in der Datenbank, und gibt einige Daten, wenn eine änderung Eintritt.
Also in meinem ini.py habe ich eine app geschaffen.route nach /Umfrage für JQuery zu nennen. JQuery gibt es einige Informationen über den client den aktuellen Status und die poll () - Funktion vergleicht dies mit dem, was aktuell in der Datenbank. Die Schleife wird beendet und gibt Informationen, wenn eine Veränderung zu beobachten ist.
Hier der python code:
@app.route('/poll')
def poll():
client_state = request.args.get("state")
#remove html encoding + whitesapce from client state
html_parser = HTMLParser.HTMLParser()
client_state = html_parser.unescape(client_state)
client_state = "".join(client_state.split())
#poll the database
while True:
time.sleep(0.5)
data = get_data()
json_state = to_json(data)
json_state = "".join(data) #remove whitespace
if json_state != client_state:
return "CHANGE"
Das problem ist, dass, wenn der obige code beginnt polling, der server scheint überlastet werden und andere Ajax-calls, und andere Anforderungen wie das laden einer "loading" - Bild zu html mit JQuery reagiert und timeout.
Zur Vervollständigung halber habe ich die JQuery-hier:
function poll() {
queryString = "state="+JSON.stringify(currentState);
$.ajax({
url:"/poll",
data: queryString,
timeout: 60000,
success: function(data) {
console.log(data);
if(currentState == null) {
currentState = JSON.parse(data);
}
else {
console.log("A change has occurred");
}
poll();
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.status + "," + textStatus + ", " + errorThrown);
poll();
}
});
}
Tut dies, müssen multi-Thread-oder was? Oder hat jemand eine Idee, warum ich bin, bei dem dieses Verhalten Auftritt?
Vielen Dank im Voraus!! 🙂
InformationsquelleAutor mickzer | 2015-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur als link @Robᵩ erwähnt, Sie Fläschchen app ist einfach nur überlastung. Das ist, weil ein Kolben app ist im single-threading-Modus standardmäßig, wenn mit
app.run()
, so kann es nur dazu dienen, eine Anforderung pro Zeit.Können Sie beginnen, multi-threading mit:
Oder mit einem WSGI-server wie gunicorn oder uwsgi zu dienen Flachmann mit multi-processing:
Hofft, dass Sie unterwegs sind, mit Python und Flask!
Die alternative, wenn mit gunicorn ist die Verwendung von Coroutinen über die eventlet oder gevent Arbeitnehmer. Tun, aber hat eine Menge von Einschränkungen, die auf Ihre Anwendung, wie Sie nur können Kunden für backend-Dienste und-Datenbanken, die coroutine bewusst zu vermeiden Sie die Blockierung des gesamten Prozesses. So Coroutinen sind nicht einfach nur Magie, die macht alles gut.
Ja, eine asynchrone server würde wie Tornado viel besser, und in der Regel meine erste Wahl für die API erstellen oder WebSocket-server.
InformationsquelleAutor kxxoling