2016-08-12 4 views
3

Ich erstelle eine Sellerie-Aufgabe in einer Situation, in der Aufgabenproduzenten mehr sind als Konsumenten (Arbeiter). Jetzt, da meine Warteschlangen gefüllt sind und die Arbeiter auf FCFS-Art konsumieren, kann ich eine bestimmte Aufgabe (mit einer task_id) sofort ausführen?Sellerie - Gegeben eine Aufgaben-ID, führe die Aufgabe aus

für zB: -

Meine Aufgaben in der folgenden Art und Weise gefüllt werden. [1,2,3,4,5,6,7,8,9,0]. Jetzt werden die Aufgaben vom nullten Index abgerufen. Nun entsteht eine Situation, in der ich vor allem Aufgabe 8 ausführen will. Wie kann ich das machen?

Der Arbeiter muss diese Aufgabe nicht ausführen (weil es Situationen geben kann, in denen ein Arbeiter bereits beschäftigt ist). Es kann direkt von der Anwendung ausgeführt werden. Wenn die Aufgabe abgeschlossen ist (entweder vom Worker oder direkt von der Anwendung), sollte sie aus der Warteschlange gelöscht werden.

Ich weiß, wie man eine Aufgabe (mit einer task_id) gewaltsam widerruft, aber wie kann ich eine Aufgabe mit einer ID ausführen?

+0

Ich denke, dass Sie Abhilfe mit revoke Aufgabe von ID und schicken Sie es zurück an den Makler mit der höchsten Priorität (aber AFAIK ist dies nur für [RabbitMQ] (https://github.com/celery verwenden können/sellerie/issues/2635 # issuecomment-173597053)) –

+0

Wenn ich eine Aufgabe widerrufe, kann ich die Parameter erhalten, die an diese Aufgabe übergeben werden? damit ich diese Aufgabe auf Anwendungsebene selbst ausführen kann. – PythonEnthusiast

+0

Ich dachte, dass Sie AsyncResult von task_id abrufen können, und Argumente von ihm abrufen, dann widerrufen Sie diese Aufgabe und erstellen Sie eine neue –

Antwort

0

Wie kann ich eine Aufgabe mit einer ID ausführen?

die kurze Antwort ist, können Sie nicht. Sellerie-Arbeiter ziehen Aufgaben vom Broker-Backend, sobald sie verfügbar sind.

Warum nicht?

Hinweis, das ist keine Einschränkung von Sellerie als solche, eher ist es eine Eigenschaft von Message Queuing-Systemen (MQS) im Allgemeinen. Der Zweck von MQS besteht darin, die Komponente einer Anwendung zu desynchronisieren, sodass der Hersteller weitere Aufgaben ausführen kann, während die Worker die Aufgaben asynchron ausführen. Mit anderen Worten, sobald eine Aufgabe abgeschickt wurde, kann sie nicht mehr geändert werden (aber sie kann entfernt werden, solange sie noch nicht gestartet wurde).

Welche Optionen gibt es?

Sellerie bietet Ihnen mehrere Optionen, um mit niedrigeren vs. höhere Priorität oder Kurz- und Langlauf Aufgaben, bei Aufgabe Einreichung Zeit:

  1. Routing - Aufgaben an verschiedenen Arbeiter verlegt werden. Wenn also Ihre Aufgaben [0 .. 9] alle mit Ausnahme von Aufgabe 8 lang andauern, können Sie Aufgabe 8 an einen Mitarbeiter oder eine Gruppe von Mitarbeitern weiterleiten, die sich mit kurz laufenden Aufgaben befassen.

  2. 10 - Geben Sie für jede Aufgabe einen Countdown oder die voraussichtliche Ankunftszeit (eta) an. Das ist eine gute Option, wenn Sie wissen, dass einige Aufgaben für die spätere Ausführung verzögert werden können, d. H. Wenn das System weniger ausgelastet ist. Dadurch sind die Mitarbeiter für die Aufgaben bereit, die sofort ausgeführt werden müssen.

  3. Task expiry - Geben Sie einen Countdown für die abgelaufene Zeit oder eine Uhrzeit mit einem Rückruf an. Auf diese Weise wird die Aufgabe widerrufen, wenn sie nicht innerhalb der zugewiesenen Zeit ausgeführt wurde und der Rückruf eine alternative Vorgehensweise starten kann.

  4. Check on task results periodically, entziehen Sie eine Aufgabe, wenn sie nicht innerhalb einiger Zeit ausgeführt wurde. Beachten Sie, dass sich dies vom Task-Ablauf unterscheidet, bei dem das Widerrufen nur dann erfolgt, wenn ein Worker die Task aus der Warteschlange abgerufen hat. Wenn die Warteschlange voll ist, kann die Sperrung für Ihren Anwendungsfall zu spät erfolgen.Wenn Sie die Ergebnisse regelmäßig überprüfen, bedeutet dies, dass Sie eine andere Komponente in Ihrem System haben, die dies tut und eine alternative Vorgehensweise ermittelt.

+0

Wenn ich eine Aufgabe widerrufe, kann ich die Parameter an diese Aufgabe übergeben? damit ich diese Aufgabe auf Anwendungsebene selbst ausführen kann. – PythonEnthusiast

+0

Sie können dies möglicherweise mit dem [task_revoked'] (http://docs.selleryproject.org/en/latest/userguide/signals.html#task-revoked) Signal oder dem ['task_revoked'] http://docs.selleryproject.org/en/latest/userguide/monitoring.html#task-revoked) Ereignis. Die Einzelheiten hängen wirklich davon ab, was Sie erreichen möchten. – miraculixx

+0

Gibt es eine Möglichkeit, die übergebenen Parameter an die Task zu übergeben, wenn task_id angegeben wird? – PythonEnthusiast

Verwandte Themen