Django Sellerie: Führe nur eine Instanz eines lang andauernden Prozesses aus

8

Ich habe einen lang andauernden Prozess, der alle fünf Minuten ausgeführt werden muss, aber mehr als eine Instanz der Prozesse sollte nie gleichzeitig ausgeführt werden. Der Prozess sollte normalerweise nicht länger als fünf Minuten dauern, aber ich möchte sicher sein, dass eine zweite Instanz nicht startet, wenn sie überläuft.

Nach einem vorherige Empfehlung verwende ich Django Sellery, um diese langwierige Aufgabe zu planen.

Ich denke nicht, dass eine periodische Aufgabe funktionieren wird, denn wenn ich einen Zeitraum von fünf Minuten habe, möchte ich nicht, dass eine zweite Aufgabe ausgeführt wird, wenn bereits eine andere Instanz der Aufgabe ausgeführt wird.

Mein aktuelles Experiment ist wie folgt: um 8:55 beginnt eine Instanz der Aufgabe zu laufen. Wenn die Aufgabe beendet ist, wird sie eine weitere Instanz von sich selbst auslösen, um die nächsten fünf Minuten zu laufen. Wenn also die erste Aufgabe um 8.57 Uhr beendet wurde, würde die zweite Aufgabe um 9.00 Uhr beginnen. Wenn die erste Aufgabe lange dauert und um 9:01 endet, wird die nächste Instanz um 9:05 Uhr geplant.

Ich habe mit einer Reihe von kryptischen Fehlern zu kämpfen gehabt, wenn ich mehr getan habe als das einfache Beispiel unten, und ich habe keine anderen Beispiele gefunden, wie Leute Aufgaben von einer früheren Instanz selbst planen. Ich frage mich, ob es vielleicht einen besseren Ansatz für das gibt, was ich versuche zu tun. Ich weiß, dass es eine Möglichkeit gibt, die Aufgaben zu benennen. Vielleicht gibt es eine Möglichkeit, nach laufenden oder geplanten Instanzen mit demselben Namen zu suchen? Hat jemand einen Ratschlag zum Ausführen einer Aufgabe alle fünf Minuten, aber stellen Sie sicher, dass immer nur eine Aufgabe ausgeführt wird?

Danke, Joe

In mymodule / tasks.py:

%Vor%

Aus einer ./manage.py-Shell:

%Vor%     
Joe J 17.01.2012, 23:10
quelle

1 Antwort

7

Sie können periodische Aufgaben verwenden, die mit einer speziellen Sperre gepaart sind, die sicherstellt, dass die Aufgaben nacheinander ausgeführt werden. Hier ist eine Beispiel-Implementierung von Celery Dokumentation:

Ссылка

Ihre beschriebene Methode mit der Task zur Planung der vorherigen Ausführung kann die Ausführung von Tasks stoppen, wenn in einer von ihnen ein Fehler auftritt.

    
mher 18.01.2012, 09:46
quelle