Tarea de apio que ejecuta más tareas


Estoy usando celerybeat para iniciar una tarea primaria que inicia una serie de tareas secundarias. Ya tengo ambas tareas escritas.

¿Hay alguna manera de hacer esto fácilmente? ¿El apio permite que las tareas se ejecuten desde dentro de las tareas?

Mi ejemplo:

@task
def compute(users=None):
    if users is None:
        users = User.objects.all()

    tasks = []
    for user in users:
        tasks.append(compute_for_user.subtask((user.id,)))

    job = TaskSet(tasks)
    job.apply_async() # raises a IOError: Socket closed

@task
def compute_for_user(user_id):
    #do some stuff

compute se llama desde celerybeat, pero causa un IOError cuando intenta ejecutar apply_async. Alguna idea?

Author: Mantas Vidutis, 2011-06-15

3 answers

Para responder a sus preguntas iniciales: A partir de la versión 2.0, Apio proporciona una manera fácil de iniciar tareas desde otras tareas. Lo que usted llama " tareas secundarias "son lo que llama"subtareas". Consulte la documentación para Conjuntos de tareas, subtareas y Callbacks, a los que @Paperino tuvo la amabilidad de enlazar.

Para la versión 3.0, Apio cambió a usar grupos para este y otros tipos de comportamiento.

Su código muestra que ya está familiarizado con esta interfaz. Su pregunta real parece ser, "¿Por qué estoy recibiendo un' Socket Closed ' IOError cuando trato de ejecutar mi conjunto de subtareas?"No creo que nadie pueda responder a eso, porque no ha proporcionado suficiente información sobre su programa. Su extracto no se puede ejecutar tal cual, por lo que no podemos examinar el problema que está teniendo por nosotros mismos. Por favor, publique el stacktrace proporcionado con el IOError, y con un poco de suerte, alguien que pueda ayudarlo con su crasher vendrá.

 28
Author: Jeremy W. Sherman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-29 23:24:25

Puedes usar algo como esto (Soporte en 3.0)

g = group(compute_for_user.s(user.id) for user in users)
g.apply_async()
 7
Author: Abhilash Joseph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-21 07:57:46

Y desde la versión 3.0 'Conjunto de tareas' ya no es el término... Grupos, Cadenas y Acordes como un tipo especial de subtarea es lo nuevo, ver http://docs.celeryproject.org/en/3.1/whatsnew-3.0.html#group-chord-chain-are-now-subtasks

 7
Author: michel.iamit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-01 22:49:04