Wenn ich in einem Tornado-Request-Handler die Funktion foo () aufrufen muss, die keinen Einfluss darauf hat, was an den Benutzer zurückgegeben wird, ist es sinnvoll, das Ergebnis zuerst an den Benutzer zu senden und dann foo () aufzurufen. Ist es möglich, dies einfach in Tornado (oder mit einem Paket von Drittanbietern) zu tun?
Nein, es ist nicht "einfach" out-of-the-box. Worauf du dich beziehst, ist "Feuer und vergiss". Selbst wenn Sie einen Thread-Pool verwenden, um die Anfrage zu farmen, gehört dieser Thread-Pool zum Python-Hauptprozess, der zu Tornado gehört.
Der beste Ansatz ist eine Nachrichtenwarteschlange. So etwas wie Karotte. Nehmen wir an, Sie haben eine Seite, auf der Benutzer einen riesigen Bericht erstellen können. Sie können ihn in einer Nachrichtenwarteschlange starten und dann die Tornado-Anfrage abschließen. Mit einigen AJAX-Zaubern und anderen Tricks (außerhalb von Tornado) können Sie das tun Lehnen Sie sich zurück und warten Sie, bis die Nachrichtenwarteschlange ihren Job beendet hat (was technisch möglicherweise auf einem verteilten Server an einem anderen physischen Ort geschieht).
ioloop.add_callback, Tornado führt den Rückruf in der nächsten IOLoop-Iteration durch.
schlechte Ratschlag Warnung: Sie können Multiprocessing verwenden.
Achten Sie darauf, dass Sie alle Ihre Datenbankverbindungen (im erzeugten Code) schließen und alles tun, was Tornado sonst tun könnte, wenn es normalerweise eine Anfrage ohne einen Unterprozess abschließt. Die anderen Antworten klingen besser. Aber du kannst das tun. Tun Sie das nicht.