Ich schreibe eine Anwendung in Flask
, die wirklich gut funktioniert, außer dass WSGI
ist synchron und blockiert. Ich habe insbesondere eine Aufgabe, die zu einer API eines Drittanbieters aufruft, und diese Aufgabe kann einige Minuten dauern. Ich möchte diesen Anruf (es ist eigentlich eine Reihe von Anrufen) machen und es laufen lassen. während die Kontrolle an Flask zurückgegeben wird.Erstellen einer asynchronen Task in Flask
Meine Ansicht wie folgt aussieht:
@app.route('/render/<id>', methods=['POST'])
def render_script(id=None):
...
data = json.loads(request.data)
text_list = data.get('text_list')
final_file = audio_class.render_audio(data=text_list)
# do stuff
return Response(
mimetype='application/json',
status=200
)
Nun, was ich tun möchte, ist die
final_file = audio_class.render_audio()
Laufleitung und einen Rückruf bieten ausgeführt wird, wenn das Verfahren kehrt werden, während Flask können Anfragen weiter bearbeiten Dies ist die einzige Aufgabe, die Flask asynchron ausführen muss, und ich hätte gerne einen Ratschlag, wie dies am besten umgesetzt werden kann. Ich habe mir Twisted
und Klein
angeschaut, aber ich bin mir nicht sicher, dass sie übertrieben sind, da vielleicht Threading
ausreichen würde.
Jeder Rat würde sehr geschätzt werden.
EDIT
Oder Vielleicht Celery
ist eine gute Wahl für das?
Normalerweise verwende ich Sellerie für diese ... es könnte Overkill sein, aber afaik Threading funktioniert nicht gut in Web-Umgebungen (Iirc ...) –
Richtig. Ja - ich habe gerade Sellerie untersucht. Es könnte ein guter Ansatz sein. Einfach mit Flask zu implementieren? –
heh ich neige dazu, einen Socket-Server auch zu benutzen (flask-socketio) und ja, ich dachte, es war ziemlich einfach ... der schwierigste Teil war, alles zu installieren –