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 anrufen process.terminate() um den Prozess zu beenden.
InformationsquelleAutor Crashthatch | 2013-08-29
Schreibe einen Kommentar