font python django celery django-celery

python - font - plt.title bold



Agregue n tareas a la cola de apio y espere los resultados (3)

Yo añadiría múltiples tareas a la cola de apio y esperaría los resultados. Tengo varias ideas de cómo lograría esto utilizando algún tipo de almacenamiento compartido (memcached, redis, db, etc.), sin embargo, pensé que es algo que Celery puede manejar automáticamente pero no puedo encontrar ningún recurso en línea.

Ejemplo de código

def do_tasks(b): for a in b: c.delay(a) return c.all_results_some_how()


Para Celery> = 3.0 , TaskSet está en deprecated en favor de group .

from celery import group from tasks import add job = group([ add.s(2, 2), add.s(4, 4), add.s(8, 8), add.s(16, 16), add.s(32, 32), ])

Iniciar el grupo en el fondo:

result = job.apply_async()

Espere:

result.join()


Tengo la corazonada de que en realidad no están deseando el retraso, sino la característica asíncrona de Celery.

Creo que realmente quieres un TaskSet :

from celery.task.sets import TaskSet from someapp.tasks import sometask def do_tasks(b): job = TaskSet([sometask.subtask((a,)) for a in b]) result = job.apply_async() # might want to handle result.successful() == False return result.join()


Task.delay devuelve AsyncResult . Utilice AsyncResult.get para obtener el resultado de cada tarea.

Para hacer eso necesitas mantener referencias a las tareas.

def do_tasks(b): tasks = [] for a in b: tasks.append(c.delay(a)) return [t.get() for t in tasks]

O puedes usar ResultSet :

def do_tasks(b): rs = ResultSet([]) for a in b: rs.add(c.delay(a)) return rs.get()