Ich versuche, ein folgendes Szenario mit Sellerie zu implementieren: zwei Warteschlangen mit (gleichen) lang laufenden Aufgaben, eine für "normal" und die andere für "Leerlauf" -Priorität.
Ich würde die Mitarbeiter dazu bringen, beide Warteschlangen zu überwachen und Aufgaben aus der "normalen" Prioritätswarteschlange als erstes zu übernehmen, und wenn sie leer ist, würde sie Aufgaben von der "Leerlauf" -Priorität übernehmen.
Meine Frage ist: Ist es möglich, die Reihenfolge zu garantieren, in der die Arbeiter ihre Aufgabenwarteschlangen überprüfen? Ist dies auch der richtige Ansatz für die Umsetzung von Prioritäten?
Hintergrund: Die Aufgaben führen ffmpeg Transcoding-Jobs aus. Die "normalen" Prioritäten wären neue Videos (die so schnell wie möglich transcodiert werden müssen) und die "Leerlauf" -Priorität wäre die Aufgabe, altes (40.000+ Video) Archiv in aktualisierte Formateinstellungen umzuwandeln. Ich habe nicht mehrere Server zur Verfügung, um Multi-Server-Task-Dispatching durchzuführen.
Nach der Theorie, dass untätige Arbeiter nicht viel Systemressourcen verbrauchen, habe ich zwei Prioritäten mit einem zweiten Austausch, einem zweiten Satz von Warteschlangen und einem zweiten Satz von Arbeitern implementiert. Ich habe keine derart intensiven Arbeitsprozesse, dass ich meine zweite Gruppe von Arbeitern nicht drosseln lasse, wenn der erste Satz aktiv ist, aber möglicherweise funktioniert der UNIX-Renice-Befehl dafür.
Sie könnten wahrscheinlich auch etwas mit einer Kontrollwarteschlange machen, so dass es für die Arbeiter nicht ausreicht, eine Arbeitsanforderung zu erhalten, sie müssen auch ein Token von einer Kontrollwarteschlange erhalten. Dann spuckst du eine kleine Anzahl von Tokens an die Leerlaufsteuerwarteschlange aus, aber eine größere Anzahl an Token an die normale Steuerwarteschlange.
Tags und Links django celery rabbitmq django-celery