Verarbeitung stoppen Kolben route, wenn die Anfrage abgebrochen
Habe ich ein Fläschchen REST-Endpunkt, einige cpu-intensive Bildverarbeitung und dauert ein paar Sekunden, um zurückzukehren. Oft wird dieser Endpunkt aufgerufen wird, dann Abbruch durch den client. In diesen Situationen würde ich gerne Abbrechen der Verarbeitung. Wie kann ich dies in Fläschchen?
In node.js ich würde Sie so etwas wie:
req.on('close', function(){
//some handler
});
Ich erwartet hatte, eine Flasche zu haben, etwas ähnliches, oder eine synchrone Methode (request.isClosed ()), die ich überprüfen könnte, an bestimmten Punkten während meiner Bearbeitung und Rücksendung zu tragen, wenn es geschlossen ist, aber ich kann Sie nicht finden.
Dachte ich über das senden etwas zu testen, dass die Verbindung noch offen ist, und die exception zu fangen, wenn es scheitert, aber es scheint Kolben Puffer alle Ausgänge, damit die exception nicht geworfen wird, bis die Verarbeitung abgeschlossen ist, und versucht das Ergebnis zurückgeben:
Eine bestehende Verbindung wurde abgebrochen, indem die software in Ihre host-Maschine
Wie storniere ich meine die Verarbeitung die Hälfte Weg durch, wenn der client bricht Ihrer Anfrage?
- Was meinst du mit "Abbruch durch den client"? Ist der client versuchen, um die Verbindung zu schließen? Oder Sie schlagen einen anderen Endpunkt? Ich glaube nicht, dass es einen Weg gibt, dies zu tun mit Thermoskanne, Sie könnten zwar sicherlich code Ihrer Endgeräte zu ermöglichen, für Sie zum beenden der Verarbeitung (die Verwendung einer Datenbank zum nachverfolgen von Aufgaben und diese haben die lang-laufende task überprüfen Sie die Datenbank für die stop-flag, zum Beispiel).
- Schließen Sie die Verbindung. Ich regenerieren ein Bild jedes mal, wenn Sie ändern Sie einige Optionen (Kontrollkästchen): wenn Sie prüfen, ein neues Feld, eine Anfrage wird ausgelöst, wenn Sie sofort überprüfen, ein zweites Feld, bevor die erste Anfrage abgeschlossen ist, wird der ursprüngliche Auftrag storniert wird (jqXHR.abort ()), und ein neues gemacht mit den neuen Optionen. Ich dachte über das auslösen eines extra-request vom client zu schreiben "wascancelled" Dateien / DB Datensätze (wie Sie vorschlagen), aber das scheint mir doch sehr hässlich. PHP hat connection_aborted(), nodejs hat req.auf('schließen'), die ich erwartet Kolben zu haben, etwas ähnliches.
- Möglicherweise finden Sie diese e-mail-thread interessant. Es wird erläutert, wie eine WSGI-Anwendung, die erkennen, wenn eine Verbindung geschlossen ist. Ich glaube, es ist ähnlich wie
connection_aborted()
funktioniert in PHP: man kann nicht einfach anrufen und bestimmen, ob die Verbindung geschlossen wurde. Stattdessen müssen Sie versuchen, Daten zu senden, wieder die erste (die Sie möglicherweise in der Lage zu ziehen aus mit streaming). - Ich weiß nicht Fläschchen sehr gut, so kann ich nicht Ihnen helfen, festzustellen, wenn ein client die Verbindung geschlossen hat. Allerdings, wenn Sie ermitteln können, haben Sie gedacht, über das tun der Bild-Bearbeitung in einem separaten Prozess mit
multiprocessing
. Wenn eine Verbindung geschlossen ist, kann man anrufenprocess.terminate()
um den Prozess zu beenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine potenziell... hacky Lösung für Ihr problem. Flasche hat die Fähigkeit zum streamen von Inhalten an den Benutzer über einen generator. Der hacky-Teil wäre streaming leere Daten überprüfen, um zu sehen, ob die Verbindung noch offen ist und dann, wenn Ihr Inhalt fertig ist der generator erzeugen konnten, das eigentliche Bild. Ihr generator überprüfen könnten, um zu sehen, wenn die Verarbeitung fertig ist und zurück
None
oder""
oder was auch immer, wenn es noch nicht fertig ist.Ich weiß nicht, was Ausnahme, die Sie erhalten, wenn der client die Verbindung schließt, aber ich bin bereit zu Wetten, seine
error: [Errno 32] Broken pipe
GeneratorExit
Ausnahme innerhalb der Schleife. Kolben anhält, hören Sie Ihre generator, wenn die Verbindung geschlossen ist und daher die Ausnahme.waitress.serve(app, send_bytes=1)
nachgeben und eine nicht leere Zeichenkette "q" statt leeren string. Der client sehen die single "q" - Zeichen kommen in strömen, aber beim drücken von "stop" in der client-browser, Kolben app weiterhin zu denken, es ist erfolgreich senden "f"s. Das entspricht node.js code mitreq.on('close', () => {})
erkennt sofort browser "Stop" - Taste drücken.Ich war nur der Versuch zu tun, die gleiche Sache in einem Projekt, und ich fand, dass mit meinem stack von uWSGI und nginx, dass, wenn ein streaming-Reaktion wurde unterbrochen, auf dem client-Ende, dass die folgenden Fehler aufgetreten
und ich konnte einfach regelmäßig alte
try
undexcept
wie untenDieser gab mir:
Soweit ich weiß, kann man nicht wissen, ob eine Verbindung geschlossen wurde, die von dem AUFTRAGGEBER während der Ausführung, da der server nicht testen, ob die Verbindung offen ist, während der Ausführung. Ich weiß, dass Sie können erstellen Sie Ihre benutzerdefinierte
request_handler
in deiner Flasche Anwendung für die Erkennung, wenn, nachdem die Anforderung verarbeitet wird, die Verbindung wurde "fallen gelassen".Beispiel:
Vielleicht möchten Sie zu untersuchen, ein bisschen mehr, und als Ihre benutzerdefinierten
request_handler
wird erstellt, wenn eine Anfrage kommt, können Sie erstellen einen thread im__init__
überprüft den status der Verbindung in jeder Sekunde und wenn Sie erkennt, dass die Verbindung geschlossen ist ( überprüfen Sie diesen thread ) dann halt die Bildverarbeitung. Aber ich denke, das ist ein bisschen kompliziert :(.connection_dropped()
. Ich bekam lediglich eine Spur fürIOError: [Errno 32] Broken pipe
.