Python >> Tutoriel Python >  >> Python

Ajoutez n tâches à la file d'attente de céleri et attendez les résultats

Pour Céleri>=3.0 , TaskSet est obsolète au profit du groupe.

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),
])

Démarrer le groupe en arrière-plan :

result = job.apply_async()

Attendez :

result.join()

Task.delay renvoie AsyncResult . Utilisez AsyncResult.get pour obtenir le résultat de chaque tâche.

Pour ce faire, vous devez conserver les références aux tâches.

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

Ou vous pouvez utiliser ResultSet :

MISE À JOUR :ResultSet est obsolète, veuillez consulter la réponse de @laffuste.

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

J'ai l'impression que vous ne voulez pas vraiment le délai mais la fonctionnalité asynchrone de Celery.

Je pense que vous voulez vraiment 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()