Vermeidung von doppelten Aufgaben in Sellerie broker
Ich möchte zu erstellen, der folgende Ablauf mit Sellerie-Konfiguration\api:
- Senden TaskA(argB) Nur, wenn Sellerie Warteschlange hat keine TaskA(argB) bereits anhängig
Ist es möglich? wie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich kann nicht denken Sie an einen Weg, sondern
Abrufen von allen ausgeführten und geplanten Aufgaben über
Sellerie inspizieren
Durchlaufen, um zu sehen, ob Ihre Aufgabe ist es.
überprüfen diese Frage ALSO zu sehen, wie der erste Punkt erledigt ist.
Glück
Können Sie Ihre Arbeit bewusst von anderen Aufgaben durch eine Art von memoization. Wenn Sie einen cache-control-Taste (redis, memcached, /tmp, was auch immer praktisch ist), können Sie die Ausführung hängt von diesem Schlüssel. Ich bin mit redis als Beispiel.
perform_task
und entfernen Sie alledecr
Anrufe. Auf diese Weise werden alle doppelten Anrufe wird nicht erneut ausgeführt, bis die reset-Aufruf. Derzeit könnte es passieren, dasstask1
Anrufe incr und läuft Aufgabetask2
Anrufe incr aber nicht ausgeführt, dasentinel !=1
;task1
Anrufe decr. Also im Grunde alle Aufgaben ausführen können, jetzt da es keine mehr doppelte Aufgaben ausgeführtperform_task
, aber das wird nicht passieren, wenn eine neuetask3
kommt jetzt, weiltask2
noch nicht genannt und decr Zähler ist 1, nicht 0.Ich weiß nicht, es ist gonna helfen Sie mehr als die anderen Antworten, aber es geht meinen Ansatz, die gleiche Idee von srj. Ich brauchte einen Weg, um die Sperrung meines Servers zu starten, Aufgaben mit derselben id in die Warteschlange. Also machte ich eine Allgemeine Funktion, um mir zu helfen.
So, ich benutze es so:
In dem Kontext, in dem meine Sellerie-app-Objekt verfügbar ist, bestimme ich:
Und so, von meinen Kunden verlangen, das nenne ich
check_task_can_not_run(...)
- und block-task aus gestartet werden, im Fall vonTrue
.Ich Stand vor dem ähnlichen problem. Der Beat wurde machen Duplikate in meiner Warteschlange. Ich wollte
expires
aber diese Funktion nicht richtig funktioniert https://github.com/celery/celery/issues/4300.So, hier ist der scheduler, der überprüft, ob die Aufgabe bereits in die Warteschlange eingereiht (basierend auf den task-Namen).