Mach' Etwas in einem Intervall

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

ich überlege gerade, wie ich es am besten umsetze. Meine Idee geht dort hin, dass ich eine Zeit festlege, und das Skript dann zu den gegebenen Zeiten ausgeführt wird. Optionen wäre zum Beispiel: mache alle Minuten was, mache jede Stunden, jeden Tag, an jedem zweiten Tag, jeden Freitag, jede Woche, jeden Monat... etc. Wenn ich also sage, mache jeden Freitag um 13 Uhr Etwas, dann soll das Skript dies ausführen. Nicht vorher, und nicht nachher. Und das ganze am besten plattformunabhängig.

Mein erster Gedanke war das time-Modul, insbesondere an time.sleep(x). Aber ich denke, dazu ist das Modul nicht zuverlässig, oder? Denn je nach dem wie lange ein bestimmter Prozess braucht, kann es sich auch zeitlich verschieben. Als Beispiel, wenn ich möchte, dass jede Minute Etwas gemacht werden soll, und die Prozedur braucht rund eine halbe Minute, dann setzt der Intervall nicht nach einer Minute wieder an, sondern erst nach 1,5 Minuten.

Gibt es Beispiele zu meinem Anliegen? Damit ich es durchstudieren kann? Welche Module wären da besser?

Bleiben wir bei dem Freitag um 13 Uhr. Ich glaube, allein dies umzusetzen könnte ich mir schon recht kompliziert vorstellen. Oder ist es "leichter" als es klingt?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun es gibt schedule, das das schon erledigt: https://github.com/dbader/schedule
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Ich bin beim Stöbern auf Crontab gestoßen. Hast du damit schon Erfahrung? Zu schedule. Funktioniert dies auch plattformunabhängig?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich weiss nicht genau, was du mit "crontab" meinst, aber "cron" ist der Unix Standardscheduler und dessen Konfigurationsdatei heisst "crontab".

Ja `schedule` ist plattformunabhaengig, es benutzt den `time.sleep` den du verworfen hast, allerdings unterstuetzt durch `datetime`.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Was ich mit crontab meinte, ist dies hier. Ich schau mir gerade das Video dort an. Nur muss ich noch herausfinden, ob dieses Modul das macht, was ich mir vorstelle. Aber Schedule werde ich mir auch ansehen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Windows hat den Task Scheduler, OS X hat launchd und Unixiode Systeme haben cron und systemd. Unabhängig davon gibt es auch noch Task Queues wie celery die sowas auch können.

Das Rad hier komplett neuzuerfinden macht keinen Sinn, die Wahrscheinlichkeit dass du (oder irgendjemand anders) etwas besseres produziert ist gering und lernen dürfte man dabei auch nicht viel außer frustrierender Kram über Zeit, Zeitzonen usw. Selbst wenn deine Lösung gut oder besser als die existierenden wäre, dürfte es schwer sein andere davon zu überzeugen. Das einzige was interessant sein könnte wäre eine Library zu schreiben die platformspezifische Lösungen abstrahiert, gibt es aber wahrscheinlich auch schon und kenne ich nur nicht.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@DasIch: Das Rad möchte ich auf keinen Fall neu erfinden. Deswegen suche ich ja Mittel und Wege. Vielleicht habe ich mich am Anfang etwas unglücklich ausgedrückt. Ich möchte einfach einen Weg finden, indem ich eine beliebige Zeit festlege und das Skript dann dies ausführt. Wie man "einfache" Zeiten abarbeiten, wie "Mache alle zwei Minuten Etwas" ist ja kein Thema. Aber was ist, wenn ich mir einen Zeitplan anlege, und das Skript soll dann nach diesem angegebenen Zeitplan arbeiten. Das war eher so meine Grundidee.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Naja, dann ist die Antwort recht einfach: Sowas macht man nicht. Du schreibst ein Skript dass alle X irgendwas ausgeführt werden soll und dann konfigurierst du ein separates Programm wie z.B. cron dies zu tun.

Ausnahme sind Situationen in denen X recht klein wird z.B. wenn du jede Minute etwas tust. Dann macht es wenig Sinn ständig einen neuen Prozess starten zu lassen und man nutzt einfach eine Schleife und time.sleep().
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@DasIch: Meine Absicht geht dorthin, dass ich in meinem Programm ein Update eingerichtet habe. Du kennst sicherlich solche Update-Einstellungen wie "Automatisch prüfen", "manuell prüfen" oder "prüfen nach Zeitplan". Bei "automatisch prüfen" schaut mein Programm kurz auf meinem Update-Server, ob ein Update vorliegt. Zum Beispiel, jedesmal wenn das Programm gestartet wird. Aber ich kann ja auch "manuell prüfen", indem ich nach meinem Belieben nach Updates schaue. Und wenn ich einen Zeitplan festlegen will, zum Beispiel "Jeden Freitag um 13 Uhr nach Updates schauen". Deswegen schaue ich nach solch einen Weg, dass mein Skript dies erledigt.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das ändert nichts an dem was ich gesagt hab. Du hast deinen Updater und den startest du einfach über cron o.ä.

Davon mal unabhängig: Einen automatischen Update Mechanismus richtig zu implementieren ist sehr schwer. Wie verhinderst du dass ein Angreifer Updates einschleusst? Was wenn ein fehlerhaftes Update veröffentlicht wird? Was wenn der Updatevorgang fehlschlägt? All dies sind Fragen auf die man eine sehr gute Antwort haben sollte. Wenn man die nicht hat, sollte man es besser bei einer Benachrichtigung des Users belassen und diesen manuell ein Update ausführen lassen. Davon unabhängig ist ein solcher Mechanismus natürlich unter Betriebssystemen mit Paketmanagern vollkommen inakzeptabel.
Antworten