2013-08-25 8 views
19

Wir haben einen Server mit Selleriearbeitern und einer Redis-Warteschlange. Die Aufgaben sind auf diesem Server definiert.
Ich muss diese Aufgaben von einem Remote-Computer aufrufen können.
Ich weiß, dass es mit send_task getan wird, aber ich habe immer noch nicht herausgefunden, wie? Wie erkläre ich send_task, wo die Warteschlange ist? Wo gebe ich Verbindungsparameter (oder was benötigt)? Ich habe stundenlang suchen und alles, was ich finden kann, ist dies:Sellerie - Wie Task von Remote-Maschine senden?

from celery.execute import send_task 
send_task('tasks.add') 

Nun, das bedeutet, dass ich celery auf meiner Berufung Maschine benötigen auch. Aber was muss ich noch einrichten?

Antwort

30

Dies ist möglicherweise ein Weg: Erstellen Sie ein Sellerie-Objekt und send_task von diesem Objekt verwenden, kann das Objekt die Konfiguration haben, um den Broker zu finden.

selleryconfig ist eine Datei, die die Sellerie-Konfiguration enthält, es gibt andere Möglichkeiten, die auf dem Sellerie-Objekt konfiguriert werden.

+2

Ich hatte kürzlich ein ähnliches Problem, bei dem der Aufruf von send_task korrekt war, die Aufgabe wurde jedoch vom Server nicht gefunden. Ich habe den Fehler "Nicht registrierte Aufgabe vom Typ empfangen ..." erhalten. Um dies zu lösen, fügen Sie in Ihren Aufgabendefinitionsdecoratoren das Argument 'name' hinzu. Beispiel kann [hier] gefunden werden (https://gist.github.com/johnpaulhayes/8403108) – johnpaulhayes

+0

OK, das ist toller Mann ... jetzt ein echter Test. Wie verwenden Sie einen Rückruf damit, damit ich den tatsächlichen Wert von der Aufgabe erhalten kann ?? – chuckjones242

+2

Etwas, das mich für ein paar Stunden abwarf, war, dass ich definieren musste, welche Warteschlange mein produzierendes Skript die "Jobs" stellte. endete mit 'sellery.send_task (' tasks.the_remote_task_name ', ([argumente, ...]), queue =' name_of_queue ') von diesem [link] (https://www.marshut.net/ipwtin /sending-tasks-from-a-machine-and-running-sellery-workers-on-another-machine.html) – lukik

0

Es gibt verschiedene Möglichkeiten, Routing-Regeln zu definieren. Die allgemeinste davon ist das benutzerdefinierte Router-Objekt. In allen Fällen stellt der Anrufer nur einen routing_key Parameter in send_task, delay oder apply_async bereit und der Router bestimmt, in welche Warteschlange die Aufgabe gesendet werden soll.

+0

Danke, aber dies führt mich zurück zum Start. Wo definiere ich diesen Routenschlüssel? Benötige ich eine Konfigurationsdatei auf dem aufrufenden Rechner? Oder muss ich etwas anderes vor dem Aufruf von 'send_task' konfigurieren? – user1102018

+0

Die Beispiele in http://docs.selleryproject.org/en/latest/getting-started/first-step-with-sellery.html#id13 zeigen, wie man eine Konfigurationsdatei erstellt und wie man Routen in der Konfigurationsdatei definiert . Sie benötigen die Konfigurationsdatei auf dem aufrufenden Rechner, da Ihr Broker REDIS ist. (Wenn Sie AMQP verwenden würden, hätten Sie stattdessen die Möglichkeit, Routing-Regeln in der Rabbit-Ebene zu definieren). –

+0

Das Dokument, das Sie erwähnten, erklärt nicht, wie send_task angewiesen wird, redis zu verwenden. Es wird nur erläutert, wie der Worker eingerichtet wird. Dadurch gibt send_task den Fehler "Connection refused" zurück (zumindest für mich) – AliBZ

1

Starten Sie auf dem Remote-Computer Sellerie mit der Broker-URL, die auf die Maschine zeigt, auf der Sie die Tasks ausführen möchten. Senden Sie dann einfach die Aufgaben (wenn Sie bestimmte Warteschlangen senden möchten, fügen Sie die entsprechenden Routingschlüssel hinzu).

-2

Was Sie gefunden haben, war richtig.

from celery.execute import send_task 

send_task('tasks.add') 

Sollten args benötigt

send_taks('tasks.add', kwargs={'a'=1, 'b'=2}) 
Verwandte Themen