Task Scheduler in Flask

Django, Flask, Bottle, WSGI, CGI…
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hallo,

ich möchte alle 7 Tage einen Job in meiner Flask-App ausführen. Ggf. kommen da noch weitere hinzu.
Ist Celery + Redis dafür die beste Wahl oder würdet ihr etwas anderes empfehlen?

Kenne mich da noch nicht aus.

Danke und LG
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Flask APScheduler?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was heißt denn "ein Job ausführen" genau? Und bist du sicher, dass das _in_ der App passieren muss und nicht z.B. über eine systemd Timer Unit (sofern die Linux benutzt) erledigt werden kann.

Celery + Redis ist ja schon ein ziemliches Schwergewicht - und dafür auch überdimensioniert. Celery dient eigentlich dazu, Jobs asynchron im Hintergrund auszuführen und dann das Ergebnis bereit zu stellen. Kontruiertes Beispiel: wenn du eine Webseite hättest, wo Leute sehr großen Zahlen eingeben können und dann geprüft wird, ob das eine Primzahl ist. Kann je nach Größe der Zahl kann das ja ein paar Sekunden oder Minuten oder Stunden dauern. Damit der Client nicht in den Timeout läuft, würde man den Client nicht warten warten lassen, sondern den Nutzer das Ergebnis später abholen lassen.

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Danke für die Antwort!
noisefloor hat geschrieben: Samstag 5. Dezember 2020, 13:43 was heißt denn "ein Job ausführen" genau?
Es soll z.b. alle 7 Tage an eine Usergruppe mit bestimmten Merkmalen eine Mail geschickt werden.

Wie wäre es denn, wenn ich einen neuen Job erstellen wollte? Muss ich dafür die App stoppen, den Code anpassen und dann das Ganze wieder starten?
Oder muss ich in der App einen Endpoint bereitstellen, worüber ich so etwas dann "von draußen" requeste und damit erstelle?
noisefloor hat geschrieben: Samstag 5. Dezember 2020, 13:43 Und bist du sicher, dass das _in_ der App passieren muss und nicht z.B. über eine systemd Timer Unit (sofern die Linux benutzt) erledigt werden kann.
Ich weiß nicht was eine Systemd timer unit ist, muss ich mal schauen. Aber das ganze wird auf Linux laufen.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das ist alles noch sehr vage... Wo liegen die Daten, die dieses "bestimmte Merkmal" haben? Die sind doch sicher irgendwie irgendwo gespeichert und werden nicht von deiner App im RAM gehalten, oder?

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Ah, oh. Sorry. Die Daten sind in einer MySQL oder Postgres DB und werden klassisch mit SQLAlchemy gehandelt. Merkmal ist einfach ein Attribut=XYZ in der DB.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok. Dann mach' das doch außerhalb. Da gibt es keine Grund, das aus der laufenden Flask-App zu machen.

Sprich: du schreibst dir ein 2. Python-Skript, was die DB-Abfrage macht und dann die Mails verschickt. Das Skript führst du dann alle 7 Tage über eine systemd Timer Unit aus. Fertig.

Gruß, noisefloor
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es ist durchaus üblich, für sowas einen Endpunkt im Webserver zu definieren, der einfach aufgerufen wird vom cron job / timer unit.

Das macht es einfacher Dinge wie Datenmodell und DB Zugang einfach mit zu nutzen.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Okey, danke für eure Einschätzungen.

Und wenn man so einen Scheduled-Job über die Admin anlegen/löschen/modifizieren möchte, dann geht es sicherlich nur über Endpunkte, oder?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Was in der DB steht, steht in der DB. Wenn du irgendwie anders einen Job durchführst, greift der ja genauso darauf zu.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Das verstehe ich nicht.

Ich meine eine Oberfläche, mit der ich bspw. ein Form mit Job-Details ausfülle und dann auf "abschicken" klicke, was dann gegen einen Endpunkt in der App läuft und so einen Job erstellt. Das gleiche dann, um einen Job, wieder zu löschen oder zu bearbeiten.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Cron / Systemd Timer Units / Tasks (bzw. "Aufgaben") unter Windows sind unabhängig von deinem Programm.
Das sind Programme, die dafür vorgesehen sind, Sachen in bestimmten Intervallen auszuführen.

Was es in der Wildbahn gibt: Ein Cron-Job, der jeden Tag ein Programm ausführt. Das Programm prüft dann, ob etwas zu tun ist. Für den Fall, dass du wirklich wiederkehrende Aufgaben im Admin-Bereich pflegen möchtest.
Aber der "Auslöser" sind die Dienste des Betriebssystems.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Und was ist mit der APScheduler Bibliothek? https://apscheduler.readthedocs.io/en/stable/

Die schreiben, dass man damit Cron oder Windows-Tasks ersetzen kann. Und die Jobs werden aus der App selbst definiert und gestartet.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du musst denke ich _noch_ detaillierter erklären, was du willst. Weiter oben steht "alle 7 Tage ein E-Mail an Nutzer, die in der DB ein bestimmtes Flag gesetzt haben". Wozu brauchst du dann die Oberfläche? Es ist immer wieder der gleiche Job. Timer Unit triggert DB Anfrage, die liefert eine Liste von Nutzern zurück und die bekommen eine Mail.

Wenn du den Job immer wieder variieren willst, dann wäre der Ansatz ggf. anders.

Gruß, noisefloor
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Danke für die Antworten.

@noisefloor: Also der Job soll schon der gleiche sein, aber ich möchte, dass die Admins diesen geplanten Job kontrollieren können bzw. ggf. löschen oder zeitlich verschieben. Dafür möchte ich, dass der Job angezeigt wird. Würde evtl. das mit der Datenbank verknüpfen und die Zeilen dann anzeigen lassen.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Antworten