2012-01-06 18 views
6

Estoy empezando con el apio en un proyecto de Django, y estoy algo atrapado en este problema en particular: básicamente, necesito distribuir una tarea de larga duración a diferentes trabajadores. La tarea se divide en varios pasos, cada uno de los cuales toma un tiempo considerable para completarse. Por lo tanto, si algún paso falla, me gustaría que el apio vuelva a intentar esta tarea utilizando el mismo trabajador para reutilizar los resultados de los pasos completados. Entiendo que el apio utiliza el enrutamiento para distribuir tareas a cierto servidor, pero no puedo encontrar nada sobre este problema en particular. Yo uso RabbitMQ como mi agente.¿Cómo hacer el intento de apio utilizando el mismo trabajador?

Respuesta

11

Usted podría tener todos los casos celeryd consumen de una cola llamada así por el nombre de host del trabajador:

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

establece el nombre de host a worker1.example.com y consumirá de una cola con el mismo nombre, así como la cola predeterminada (llamado celery).

A continuación, para dirigir una tarea a un determinado trabajador puede utilizar:

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

similary para dirigir un reintento:

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

o para dirigir el reintento para el mismo trabajador:

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

¡Muchas gracias por la respuesta! Creo que esto es exactamente lo que estoy buscando. No me di cuenta de que podemos pasar el nombre de la cola para reintentar(), pero ahora tiene mucho sentido :) – dangmai

+0

'celeryd' ahora está en desuso, use' apio trabajador'. – user

+0

Utilice '% computername%' en windows y '\' hostname \ '' en linux para compilar la línea de comandos. – ubershmekel

Cuestiones relacionadas