2015-04-13 14 views
5

In der Anwendung, an der ich arbeite, kann ein Benutzer einen "Übergang" durchführen, der aus "Schritten" besteht. Ein Schritt kann eine beliebige Anzahl von Abhängigkeiten von anderen Schritten haben. Ich möchte in der Lage sein, einen Übergang aufzurufen und die Schritte parallel als separate Sellerie-Aufgaben ausführen zu lassen.Sellerie - Ausführen einer Reihe von Aufgaben mit komplexen Abhängigkeiten

Idealerweise hätte ich gerne etwas in der Art von celery-tasktree, außer für gerichtete azyklische Graphen im Allgemeinen und nicht nur für Bäume, aber es scheint nicht, dass eine solche Bibliothek existiert.

Die erste Lösung, die in den Sinn kommt, ist eine parallele Anpassung einer topologischen Standardsortierung - anstatt eine lineare Reihenfolge von Schritten zu bestimmen, die die Abhängigkeitsbeziehung erfüllen, bestimmen wir die gesamte Reihe von Schritten, die parallel ausgeführt werden können Anfang, gefolgt von den gesamten Schritten, die in Runde 2 ausgeführt werden können, und so weiter.

Dies ist jedoch nicht optimal, wenn Aufgaben eine variable Zeit benötigen und die Mitarbeiter im Leerlauf auf eine länger laufende Aufgabe warten müssen, während Aufgaben vorhanden sind, die jetzt ausgeführt werden können. (Für meine spezifische Anwendung ist diese Lösung wahrscheinlich in Ordnung, aber ich würde immer noch gerne herausfinden, wie dies zu optimieren.)

Wie in https://cs.stackexchange.com/questions/2524/getting-parallel-items-in-dependency-resolution erwähnt, ist eine bessere Möglichkeit, direkt von der DAG - nach jedem Aufgabe beendet, prüft, ob eine ihrer abhängigen Aufgaben nun ausgeführt werden kann, und wenn dies der Fall ist, führen Sie sie aus.

Was wäre der beste Weg, um so etwas zu implementieren? Es ist mir nicht klar, dass es einen einfachen Weg dafür gibt.

Von was ich sagen kann, sind Selleries Gruppe/Kette/Akkord Grundelemente nicht flexibel genug, um mir eine volle DAG auszudrücken - obwohl ich hier vielleicht falsch liege?

Ich denke, ich könnte einen Wrapper für Aufgaben erstellen, die abhängige Aufgaben benachrichtigt, sobald die aktuelle Aufgabe abgeschlossen ist - ich bin mir nicht sicher, was der beste Weg, um eine solche Benachrichtigung zu behandeln wäre. Der Zugriff auf die Django-Datenbank der Anwendung ist nicht besonders sauber und würde es schwierig machen, dies in eine generische Bibliothek zu übertragen, aber Sellery selbst bietet keine offensichtlichen Mechanismen dafür.

+0

Ich habe die gleiche Frage. Hast du etwas gefunden? – neoascetic

+1

Haben Sie die gleiche Frage. Mein bester Gedanke war ... Sellerie nicht zu benutzen: -/Aber das lässt mich selbst viel Infrastruktur schreiben. – matthewatabet

+1

Ich habe ein Github-Problem für diese hier geöffnet: https://github.com/sellery/sellery/issues/3666 – matthewatabet

Antwort

1

Ich habe auch dieses Problem konfrontiert, aber ich konnte nicht wirklich eine bessere Lösung oder Bibliothek mit Ausnahme einer Bibliothek zu finden, Für alle noch interessiert, können Sie https://github.com/selinon/selinon. Obwohl es nur für Python 3 ist, scheint es die einzige Sache zu sein, die genau das tut, was Sie wollen.

Der Luftstrom ist eine weitere Option, aber der Luftstrom wird in einer eher statischen Umgebung verwendet, genau wie bei anderen dag-Bibliotheken.

+0

Oh, das sieht * erstaunlich *. Wenn ich nur noch bei der Firma arbeiten würde, bei der ich beschäftigt war, als ich diese Frage gestellt habe :) – ajd

Verwandte Themen