2012-01-06 11 views
6

Sono appena iniziato con il sedano in un progetto Django, e sono piuttosto bloccato a questo particolare problema: Fondamentalmente, ho bisogno di distribuire un'attività a lungo termine a diversi lavoratori. L'attività è in realtà suddivisa in diversi passaggi, ognuno dei quali richiede molto tempo per essere completato. Pertanto, se qualche passaggio fallisce, vorrei che il sedano riprovasse questa attività usando lo stesso operatore per riutilizzare i risultati dei passaggi completati. Capisco che il sedano usi il routing per distribuire le attività su determinati server, ma non riesco a trovare nulla su questo particolare problema. Io uso RabbitMQ come mio broker.Come riprovare il sedano utilizzando lo stesso operatore?

risposta

11

Si potrebbe avere tutti i casi celeryd consumano da una coda che prende il nome il nome host del lavoratore:

celeryd -l info -n worker1.example.com -Q celery,worker1.example.com 

imposta il nome dell'host per worker1.example.com e consumerà da una coda di nome stesso, così come la coda di default (denominato celery).

Poi per dirigere un compito di un lavoratore specifica è possibile utilizzare:

task.apply_async(args, kwargs, queue="worker1.example.com") 

similmente a dirigere un nuovo tentativo:

task.retry(queue="worker1.example.com") 

o per dirigere il nuovo tentativo per lo stesso lavoratore:

task.retry(queue=task.request.hostname) 
+0

Grazie mille per la risposta! Penso che questo sia esattamente quello che sto cercando. Non mi sono reso conto che possiamo passare il nome della coda per riprovare(), ma ora ha molto senso :) – dangmai

+0

'celeryd' ora è deprecato, usa' operatore di celery'. – user

+0

Usa '% computername%' su windows e '\' hostname \ '' su linux per creare la riga di comando. – ubershmekel

Problemi correlati