Sellerie Zeitplan für die Aufgabe (Sellerie, Django und RabbitMQ)
Ich will eine Aufgabe, die ausgeführt wird, alle 5 Minuten, aber es wird warten, für die Letzte Ausführung beendet ist, und dann zählen diese 5 Minuten. (So kann ich auch sicher sein, dass es nur eine task laufen) Der einfachste Weg, ich fand laufen django-Anwendung manage.py shell und führen Sie dieses:
while True:
result = task.delay()
result.wait()
sleep(5)
aber für jede Aufgabe, die ich ausführen wollen, diese Art, wie ich laufen, es ist ein eigenes shell, gibt es eine einfache Möglichkeit, es zu tun? Möglicherweise werden einige king custom ot django-celery-scheduler?
InformationsquelleAutor Julian Popov | 2011-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles, was Sie brauchen, ist anzugeben, in Sellerie conf witch Aufgabe, die Sie ausführen möchten, in regelmäßigen Abständen und mit welchem Intervall.
Beispiel: Ausführen der Aufgaben.add task alle 30 Sekunden
Denken Sie daran, dass Sie haben zu laufen Sellerie im beat-Modus mit der option-B
Können Sie auch die crontab-Stil statt Zeitintervall, checkout:
http://ask.github.com/celery/userguide/periodic-tasks.html
Wenn Sie mit django-celery denken Sie daran, dass Sie können auch verwenden, tha django db scheduler für periodische Aufgaben, auf diese Weise können Sie ganz einfach durch das django-celery admin panel neue periodische Aufgaben.
Für tun, dass Sie benötigen, um die celerybeat-Planer settings.py auf diese Weise
Danke für die Ratschläge, aber ich glaube, ich will etwas anderes - ich möchte einen job erstellen, senden Sie es zur Ausführung, und erstellen Sie einen anderen job NUR, wenn die AUSFÜHRUNG des vorherigen beendet ist. Ich will nicht, um Arbeitsplätze zu schaffen, bis ich weiß, dass der Vorherige abgeschlossen ist. Ich will die Aufgabe, synchron (nicht asynchron) Verhalten
Das Globale Ziel ist, eine Aufgabe auszuführen, für die ich nicht sagen kann, wie viel Zeit es dauert und wenn es fertig ist für einige Zeit warten, und starten Sie es erneut. Auch ich habe, um sicher zu sein, dass es nicht ausgeführt werden 2 oder mehrere Male gleichzeitig von verschiedenen worker-threads, und auch, dass ich nicht Schreibe meine eigenen Programm-code, dies zu tun.
Wenn Sie sicherstellen möchten, dass eine Aufgabe erst startet, nachdem man Sie fertig sind, verwenden Sie memcached (oder django-cache) zu erstellen, die eine Sperre auf die Art der Aufgabe oder Ressource in der besagten Aufgabe. Seine einfache und skalierbar zu tun.
Das ist nicht wahr, zumindest von 3.0.12,
celery beat
wird sicherlich erstellen von überlappenden Aufgaben.InformationsquelleAutor Mauro Rocco
Wow es ist erstaunlich, wie niemand versteht diese person die Frage. Fragen Sie sich nicht über das ausführen von Aufgaben in regelmäßigen Abständen, aber, wie Sie sicherstellen, dass Sellerie nicht laufen zwei Instanzen des gleichen tasks gleichzeitig. Ich glaube nicht, dass es einen Weg gibt, dies zu tun mit Sellerie direkt, aber was Sie tun können, ist eine der Aufgaben, die eine Sperre erwerben rechts, wenn es beginnt, und wenn es scheitert, um zu versuchen, wieder in ein paar Sekunden (mithilfe von retry). Die Aufgabe würde die Sperre wieder freigeben, bevor es richtig gibt; Sie können die Sperre automatisch-erlischt nach einigen Minuten, wenn es immer abstürzt oder mal aus.
Für die Sperre kann man wohl nur verwenden Ihre Datenbank oder so etwas wie Redis.
InformationsquelleAutor Cesar
Können Sie daran interessiert, diese einfachere Methode, erfordert keine änderungen an einer Sellerie conf.
Die neueste version von Sellerie nicht dieser Dekorator. Sie müssen nur mit Hilfe der Anleitung hier: docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
InformationsquelleAutor Conley Owens
Erweitern @MauroRocco post von http://docs.celeryproject.org/en/v2.2.4/userguide/periodic-tasks.html
So wird dies in der Tat das Ziel zu erreichen, die Sie wollen.
Wenn Sie möchten, dass die Aufgabe alle 30 Sekunden, unabhängig von der Dauer, als Sie einen crontab planen, aber denken Sie daran, dass diese Aufgabe Hinzugefügt werden, die Sellerie-Warteschlange und wenn es andere Aufgaben, die in der Ausführung/in Warteschlange Sie nicht sicher sind, dass Sie die Aufgabe beginnen zum angegebenen Zeitpunkt.
InformationsquelleAutor dkuebric
Weil der Sellerie.Dekorateure veraltet, können Sie periodic_task decorator so aus:
InformationsquelleAutor Murat Çorlu
Hinzufügen, dass diese Aufgabe eine separate Warteschlange, und dann verwenden Sie eine separate worker für die Warteschlange mit der Parallelität option auf 1 festgelegt.
InformationsquelleAutor josven