Ich möchte ein verteiltes Job Execution System mit Sellerie implementieren. Da rabbitMQ keine Prioritäten unterstützt und ich diese Funktion schmerzlich brauche, wandte ich mich an Sellerie + Redis.Aufgabe Priorität in Sellerie mit Redis
In meiner Situation sind die Aufgaben eng mit Hardware verbunden, zum Beispiel, Aufgabe A konnte nur auf Arbeiter 1 laufen, da nur der PC von Arbeiter 1 die notwendige Hardware hat. Ich setze den CONCURRENCY jedes Arbeiters auf 1, so dass ein Arbeiter jedes Mal nur eine Aufgabe ausführt. Jede Aufgabe dauert etwa 2 Minuten.
Um die Priorität-Funktion, vor allem implementiere ich priority
Argument versucht, das Hinzufügen, wenn apply_async()
Aufruf, zum Beispiel apply_async(priority=0)
und apply_async(priority=9)
. In diesem Test startete ich nur einen Worker mit COCURRENCY = 1 und startete 10 Aufgaben nacheinander mit unterschiedlichen Prioritäten. Ich habe erwartet, dass die Aufgaben, die von apply_async(priority=0)
gestartet werden, vorrangig ausgeführt werden, aber unglücklicherweise werden sie gerade als Kick-Off-Order gestartet.
Dann versuche ich etwas Arbeit zu tun. Ich habe jede Aufgabe geklont, also habe ich task_high und task_low für jeden von @celery.task(priority=0)
und @celery.task(priority=1)
. Dann habe ich den gleichen Test wie oben durchgeführt, diesmal war es besser, wenn die Anstoßreihenfolge "HH-LLLL-HHHH" ist, lautet die reale Reihenfolge "HH-L-H-H-L-H-L-L-H". Ich nehme an, dass redis hier einige planerische und ausgleichende Arbeit geleistet hat.
Aber das kann immer noch nicht meine Erwartungen erfüllen. Ich hoffe, eine Bestellung wie "HHHHHH-LLLL" bekommen zu können, denn für einige Aufgaben habe ich nur eine richtige Maschine mit der nötigen Hardware und hoffe die hochpriorisierte Aufgabe so schnell wie möglich zu erledigen.
Ich habe nach anderen Arbeiten im Internet gesucht, zum Beispiel mit zwei Warteschlangen, eine für Aufgaben mit hoher Priorität und die andere für niedrige Priorität und die Verwendung von 2 Maschinen für die ehemalige und 1 Maschine für die letztere. Aber da meine Hardware ziemlich begrenzt ist, funktioniert das nicht für mich.
Könnten Sie bitte einige Vorschläge machen?
Danke für die Details, aber was kann ich tun, um eine Bestellung zu bekommen, wie ich will? Sollte ich nur die 'priority_steps' ändern? –
Sie werden es einfach ausprobieren. Mit den Standard-Prioritätsschritten werden diese 0 und 1 nur auf 0 konsolidiert. – asksol
OK Danke, ich habe versucht mit Priorität 0 für Aufgabe hoch und Priorität 9 für Aufgabe niedrig, jetzt scheint es viel besser, obwohl manchmal einige Aufgaben mit Priorität 9 noch vor denen mit Priorität 0 laufen. Ich weiß nicht, ob da was ist falsch mit meinen Konfigurationen oder es ist Redis, die einige Balancing-Arbeit getan hat. –