2017-12-06 4 views
1

Wie kann ich eine periodische Aufgabe in Python ohne Blockierung planen?Wie plane ich eine periodische Aufgabe in Python?

Hier ist eine einfache Situation. Angenommen, diese Ticketvariable wird nach 2 Stunden ungültig. Also muss ich es von einem Server holen, aber ich halte es einfach.

Wie kann ich alle zwei Stunden auf 1 zurücksetzen, ohne zu blockieren?

Ein Weg könnte sein, einen Thread zu starten und für 2 Stunden zu schlafen und dann die Variable zurückzusetzen, aber ich frage mich, ob es bessere Alternativen gibt.

Hinweis: Alles läuft in einem Andockfenster.

+0

Mögliche Duplikate von [Wie bekomme ich einen Cron-ähnlichen Scheduler in Python?] (Https://stackoverflow.com/questions/373335/how-do-i-get-a-cron-like-scheduler-in-in- python) – YSelf

Antwort

3

Das sieht wie ein Anwendungsfall für cron, ein einfaches Programm auf all Linux-Maschinen gefunden periodische Aufgaben zu planen. Eine einfache cron Aufgabe könnte so erstellt werden:

$ crontab -e 

Im cron, einen Eintrag

0 */2 * * * /home/username/ticket_script.py 

Stellen Sie sicher, dass Ihr Skript ausführbare Berechtigungen. Für den Fall, drucken Sie etwas in Ihrem Skript, machen den cron-Eintrag seine ouput wie

auf läuft dies in Docker
0 */2 * * * /home/username/ticket_script.py >> /home/username/ticket_script_runs.log 

Für gotchas zu umleiten, können Sie diesen Thread durchlaufen ->https://forums.docker.com/t/cronjobs-in-docker-container/2618/5 die sagt:

Die meisten Docker-Container führen nur die von Ihnen angegebene Binärdatei aus (in diesem Fall/bin/bash), daher wird kein Cron-Daemon ausgeführt, um diese Jobs auszulösen.

Es gibt eine Reihe von Möglichkeiten, wie Sie damit umgehen können - für kleine adhoc Dinge, können Sie den cron-Eintrag zu Ihrem Host-crontab hinzufügen und den Auftrag im Container mit Docker exec Container auslösen ...

Sie können den Container-Einstiegspunkt durch ein Shell-Skript ersetzen, das den Cron startet, oder wenn Sie mehrere Dienste benötigen, verwenden Sie etwas wie supervisord, um sie zu verwalten.

Und wenn Sie all-in gehen, können Sie einen Cron-Container erstellen, den Sie dann verwenden können, um Aufgaben mit docker exec zu starten.


Der andere Ansatz ist, was Sie bereits haben - für 2 Stunden schlafen gehen, oder einen time_last_read Zeitstempel halten, halten, wenn seine seit 2 Stunden seit dem letzten Lese (time_now - time_last_read >= 2_HOURS) Auswertung und wieder lesen der Wert in den Speicher, sobald die Bedingung True ist und time_last_read zurücksetzen.

+0

ging einfach mit der einfachen Überprüfung Zeit Methode anstelle von Cron. – utengr

+1

@utengr Glücklich zu helfen. Ich habe der Frage Docker-Tag hinzugefügt, da es in diesem Fall die Auswahl der Lösung stark beeinflusst hat. –

1

Setzen Sie es in eine Funktion mit time.sleep(7200000). Wie so:

import time 

ticket = 1 

def main_loop(): 
    while True: 
     time.sleep(7200000) 
     ticket = 1 

def process_using_ticket(): 
    print('hello', ticket) 
main_loop() 
Verwandte Themen