Ich habe ein Flask-Webhosting ohne Zugriff auf cron
Befehle.
Wie kann ich jede Stunde eine Python-Funktion ausführen?
Sie können BackgroundScheduler()
aus dem APScheduler- Paket (v3.5.3) verwenden:
import time
import atexit
from apscheduler.schedulers.background import BackgroundScheduler
def print_date_time():
print(time.strftime("%A, %d. %B %Y %I:%M:%S %p"))
scheduler = BackgroundScheduler()
scheduler.add_job(func=print_date_time, trigger="interval", seconds=3)
scheduler.start()
# Shut down the scheduler when exiting the app
atexit.register(lambda: scheduler.shutdown())
Beachten Sie, dass zwei dieser Scheduler gestartet werden, wenn sich Flask im Debug-Modus befindet. Weitere Informationen finden Sie in dieser Frage.
flask
einApp.runonce
oder hättenApp.runForNseconds
, könnten Sie zwischenschedule
und dem Kolbenläufer wechseln , aber dies ist nicht der Fall, so dass der einzige Weg für jetzt ist, dies zu verwendenSie können
APScheduler
in Ihrer Flask-Anwendung verwenden und Ihre Jobs über die Benutzeroberfläche ausführen:quelle
lambda
drinnenatexit.register
?atexit.register
braucht man eine Funktion zum aufrufen. Wenn wir nur bestanden hättencron.shutdown(wait=False)
, würden wir das Ergebnis des Anrufs weitergebencron.shutdown
(was wahrscheinlich istNone
). Anstatt also geben wir eine Null-Argument Funktion, und statt ihm einen Namen und eine using Anweisungdef shutdown(): cron.shutdown(wait=False)
undatexit.register(shutdown)
wir stattdessen es registrieren inline mitlambda:
(das ist ein Null-Argument Funktion Ausdruck .)Ich bin ein bisschen neu mit dem Konzept der Anwendungsplaner, aber was ich hier für APScheduler v3.3.1 gefunden habe , ist etwas anderes. Ich glaube, dass sich für die neuesten Versionen die Paketstruktur, die Klassennamen usw. geändert haben. Deshalb stelle ich hier eine neue Lösung vor, die ich kürzlich erstellt habe und die in eine grundlegende Flask-Anwendung integriert ist:
Ich lasse diesen Kern auch hier , wenn jemand Interesse an Updates für dieses Beispiel hat.
Hier sind einige Referenzen für zukünftige Lesungen:
quelle
apscheduler.schedulers.background
, da möglicherweise andere nützliche Szenarien für Ihre Anwendung auftreten. Grüße.Sie können versuchen, den BackgroundScheduler von APScheduler zu verwenden, um Intervalljobs in Ihre Flask-App zu integrieren. Unten sehen Sie das Beispiel, das Blueprint und App Factory ( init .py) verwendet:
Ich hoffe es hilft :)
Ref:
quelle
Für eine einfache Lösung können Sie eine Route wie z
Fügen Sie dann einen Unix-Cron-Job hinzu , der regelmäßig POSTs an diesen Endpunkt sendet. Führen Sie es beispielsweise einmal pro Minute im Terminaltyp aus
crontab -e
und fügen Sie diese Zeile hinzu:(Beachten Sie, dass der Pfad zum Einrollen vollständig sein muss, da der Job beim Ausführen des Jobs nicht über Ihren PATH verfügt. Den vollständigen Pfad zum Einrollen auf Ihrem System finden Sie unter
which curl
)Ich mag das, weil es einfach ist, den Job manuell zu testen, es gibt keine zusätzlichen Abhängigkeiten und da nichts Besonderes vor sich geht, ist es leicht zu verstehen.
Sicherheit
Wenn Sie Ihren Cron-Job mit einem Kennwort schützen möchten, können Sie
pip install Flask-BasicAuth
die Anmeldeinformationen zu Ihrer App-Konfiguration hinzufügen:So schützen Sie den Jobendpunkt mit einem Kennwort:
Dann rufen Sie es von Ihrem Cron-Job aus auf:
quelle
Eine andere Alternative könnte die Verwendung von Flask-APScheduler sein, das gut mit Flask zusammenarbeitet, z.
Weitere Informationen hier:
https://pypi.python.org/pypi/Flask-APScheduler
quelle
Ein vollständiges Beispiel mit Zeitplan und Mehrfachverarbeitung, mit Ein- und Ausschaltsteuerung und Parameter für run_job (). Die Rückkehrcodes werden vereinfacht und das Intervall auf 10
every(2).hour.do()
Sekunden eingestellt. Wechseln Sie für 2 Stunden zu. Der Zeitplan ist ziemlich beeindruckend, er driftet nicht und ich habe ihn bei der Planung nie mehr als 100 ms entfernt gesehen. Verwenden von Multiprocessing anstelle von Threading, da es eine Beendigungsmethode gibt.Sie testen dies, indem Sie einfach Folgendes ausgeben:
Alle 10 Sekunden, in denen der Timer eingeschaltet ist, wird eine Timer-Nachricht an die Konsole ausgegeben:
quelle
Möglicherweise möchten Sie einen Warteschlangenmechanismus mit Scheduler wie RQ Scheduler oder etwas Schwererem wie Celery (höchstwahrscheinlich ein Overkill) verwenden.
quelle