Seite 1 von 1
Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 19:40
von Sophus
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?
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 19:51
von cofi
Nun es gibt schedule, das das schon erledigt:
https://github.com/dbader/schedule
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 19:58
von Sophus
Ich bin beim Stöbern auf Crontab gestoßen. Hast du damit schon Erfahrung? Zu schedule. Funktioniert dies auch plattformunabhängig?
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:01
von cofi
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`.
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:05
von Sophus
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.
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:06
von DasIch
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.
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:17
von Sophus
@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.
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:26
von DasIch
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().
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:33
von Sophus
@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.
Re: Mach' Etwas in einem Intervall
Verfasst: Freitag 28. August 2015, 20:50
von DasIch
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.