2013-08-25 18 views
19

Abbiamo un server che esegue i lavoratori del sedano e una coda Redis. Le attività sono definite su quel server.
Devo essere in grado di chiamare queste attività da una macchina remota.
So che è stato fatto usando send_task ma non ho ancora capito come? Come si dice a send_task dove si trova la coda? Dove posso passare i parametri di connessione (o qualsiasi altra cosa necessaria)? Ho cercato per ore e tutto quello che posso trovare è questo:Celery - Come inviare attività dalla macchina remota?

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

Bene, questo significa che ho bisogno celery sulla mia macchina chiamata pure. Ma cos'altro ho bisogno di impostare?

risposta

30

Questo può essere un modo: Creazione di un oggetto Celery e utilizzando send_task da tale oggetto, l'oggetto può avere la configurazione per trovare il broker.

from celery import Celery 
celery = Celery() 
celery.config_from_object('celeryconfig') 
celery.send_task('tasks.add', (2,2)) 

celeryconfig è un file contenente la configurazione del sedano, ci sono altri modi stabiliti config sull'oggetto sedano.

+2

Recentemente ho avuto un problema simile in cui la chiamata send_task era corretta, tuttavia l'attività non è stata trovata dal server. Ho ricevuto un messaggio di errore "Ricevuta attività non registrata di tipo ...". Per risolvere questo, nel tuo decoratore di definizioni di compiti aggiungi l'argomento 'nome'. Esempio può essere trovato [qui] (https://gist.github.com/johnpaulhayes/8403108) – johnpaulhayes

+0

OK, questo è un grande uomo ... ora un vero test. Come si utilizza una richiamata con quella in modo da poter ottenere il valore effettivo restituito dall'attività ?? – chuckjones242

+2

Qualcosa che mi ha buttato fuori per qualche ora era che avevo bisogno di definire quale coda la mia sceneggiatura produceva i "lavori". finito con 'celery.send_task ('tasks.the_remote_task_name', ([argomenti, ...]), queue = 'name_of_queue')' ottenuto da questo [collegamento] (https://www.marshut.net/ipwtin /seguendo-task-da-a-machine-and-running-celery-workers-on-another-machine.html) – lukik

0

Esistono diversi modi per definire le regole di instradamento, la più generale delle quali è l'oggetto router personalizzato. In tutti i casi, il chiamante fornisce solo un parametro routing_key in send_task, delay o apply_async e il router determina in quale coda inviare l'attività.

+0

Grazie, ma questo mi porta di nuovo al punto di partenza. Dove posso definire questa chiave di percorso? Ho bisogno di un file di configurazione sul chiamante? O c'è qualcos'altro che devo configurare prima di chiamare 'send_task'? – user1102018

+0

Gli esempi in http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#id13 mostrano come creare un file di configurazione e come definire le rotte nel file di configurazione . È necessario il file di configurazione sul computer chiamante poiché il broker è REDIS. (Se stavate usando AMQP, avreste invece la possibilità di definire le regole di routing nel livello Rabbit). –

+0

Il documento che hai menzionato non spiega come dire a send_task di usare redis. Spiega solo come configurare il lavoratore. Facendo ciò, send_task restituisce l'errore "Connessione rifiutata" (almeno per me) – AliBZ

1

sulla macchina remota, avviare il sedano con broker_url che punta alla macchina su cui si desidera eseguire le attività. Quindi invia semplicemente le attività (se hai code specifiche da inviare, quindi aggiungi le chiavi di routing appropriate).

-2

Quello che hai trovato era giusto.

from celery.execute import send_task 

send_task('tasks.add') 

Se alcuni argomenti necessari

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