Funktion in Flask soll jeweils nur 1x laufen (Thread)
Verfasst: Freitag 8. September 2023, 19:09
Hallo,
ich komme zu keiner Lösung. Ich habe eine lauende Flask Applikation. Bisher funktioniert alles.
Diese ruft von einer externen Seite Daten ab, bereitet diese auf, und gibt dies aus. (Also nichts neues)
"Daten von externen", es werden immer nur Daten seit dem letzten Abruf nachgeladen. Dies geht recht schnell. 1-5sek.
Nun habe ich festgestellt, das sich ältere Daten auch mal ändern können. Nun möchte ich ein Force Update implementieren. Welche einen größeren/gesamten Zeitraum betrachtet.
Dieser Prozess würde ca. 3-6min dauern.
Bis zu diese Stelle gibt es auch kein Problem.
Aber ...
Ich möchte diesen Update Prozess nur 1x ausführen, egal wie oft diese Funktion ab/aufgerufen wird. Es sollte weder ein Reload noch ein weitere User diesen Prozess nochmals ausführen, solange dieser am laufen ist.
Und hier komme ich nicht weiter.
Das mit dem Thread ist mir als erstes eingefallen, falls es andere Möglichkiten gibt, ich bin offen.
Ich dachte, ich lasse dieses Funktion über ein Thread laufen und weitere Aufrufe sollten mit einem "Update läuft gerade" beantwortet werden.
Egal was/wie ich es mit dem Threading heute Probiert habe, ".is_alive()" liefert mit immer ein "False" zurück.
Ja das " if t.is_alive():" fehlt, dies habe ich mit einer einer leeren Variable "t" in der __init__ probiert und diese global eingebunden, usw... (egal was ich machte) nichts half.
Ich bin nicht der Profi, das Problem aber sollte daran liegen, das jeder Aufruf in einer eigenen Instanz/Thread läuft und dieser eben das "t" nicht findet.
Eine alternative, ich schreibe mit Aufruf der Funktion ein is_running True in die DB und prüfe darauf. Ich wollte es aber einfacher halten. (sonst müsste ich z.b. bei einem neustart der Applikation diesen Eintrag immer reseten, sonst ist duch diesen Falschen eintrag kein erneuter Aufruf möglich., etc...)
Ist solch eine Funktionsweiße eher ungewöhnlich (eine Funktion darf/soll nur 1x laufen)?
Denn egal nach was ich suchte, ich konnte nicht mal ein ähnliches Problem/bsp. finden. (Suche war eingeschränkt, da ich immer nach "Threads" in diesem Zusammenhang gesucht habe.)
Viele Grüße
Chris
ich komme zu keiner Lösung. Ich habe eine lauende Flask Applikation. Bisher funktioniert alles.
Diese ruft von einer externen Seite Daten ab, bereitet diese auf, und gibt dies aus. (Also nichts neues)
"Daten von externen", es werden immer nur Daten seit dem letzten Abruf nachgeladen. Dies geht recht schnell. 1-5sek.
Nun habe ich festgestellt, das sich ältere Daten auch mal ändern können. Nun möchte ich ein Force Update implementieren. Welche einen größeren/gesamten Zeitraum betrachtet.
Dieser Prozess würde ca. 3-6min dauern.
Bis zu diese Stelle gibt es auch kein Problem.
Aber ...
Ich möchte diesen Update Prozess nur 1x ausführen, egal wie oft diese Funktion ab/aufgerufen wird. Es sollte weder ein Reload noch ein weitere User diesen Prozess nochmals ausführen, solange dieser am laufen ist.
Und hier komme ich nicht weiter.
Das mit dem Thread ist mir als erstes eingefallen, falls es andere Möglichkiten gibt, ich bin offen.
Ich dachte, ich lasse dieses Funktion über ein Thread laufen und weitere Aufrufe sollten mit einem "Update läuft gerade" beantwortet werden.
Egal was/wie ich es mit dem Threading heute Probiert habe, ".is_alive()" liefert mit immer ein "False" zurück.
Code: Alles auswählen
@blueprint.route('/force_update', methods=['GET'])
def force_update():
t = threading.Thread(target=force_update, name="force_update")
t.start()
return 'Update Prozess läuft. Bitte warten', 200
Code: Alles auswählen
# Funktioniert so alleine nicht, dient nur als einfaches bsp.
@blueprint.route('/force_update', methods=['GET'])
def force_update():
if t.is_alive():
return 'Update läuft noch', 200
else:
t = threading.Thread(target=force_update, name="force_update")
t.start()
return "Update Prozess startet. Bitte warten", 200
Ich bin nicht der Profi, das Problem aber sollte daran liegen, das jeder Aufruf in einer eigenen Instanz/Thread läuft und dieser eben das "t" nicht findet.
Eine alternative, ich schreibe mit Aufruf der Funktion ein is_running True in die DB und prüfe darauf. Ich wollte es aber einfacher halten. (sonst müsste ich z.b. bei einem neustart der Applikation diesen Eintrag immer reseten, sonst ist duch diesen Falschen eintrag kein erneuter Aufruf möglich., etc...)
Ist solch eine Funktionsweiße eher ungewöhnlich (eine Funktion darf/soll nur 1x laufen)?
Denn egal nach was ich suchte, ich konnte nicht mal ein ähnliches Problem/bsp. finden. (Suche war eingeschränkt, da ich immer nach "Threads" in diesem Zusammenhang gesucht habe.)
Viele Grüße
Chris