Running a task after all tasks have been completed

后端 未结 4 2017
迷失自我
迷失自我 2020-12-29 09:21

I\'m writing an application which needs to run a series of tasks in parallel and then a single task with the results of all the tasks run:

@celery.task
def p         


        
4条回答
  •  孤独总比滥情好
    2020-12-29 09:38

    Here's a solution which worked for my purposes:

    tasks.py:

    from time import sleep
    
    import random
    
    @celery.task
    def power(value, expo):
        sleep(random.randint(10, 1000) / 1000.0) # sleep for 10-1000ms
        return value ** expo
    
    @celery.task
    def amass(results, tasks):
        completed_tasks = []
        for task in tasks:
            if task.ready():
                completed_tasks.append(task)
                results.append(task.get())
    
        # remove completed tasks
        tasks = list(set(tasks) - set(completed_tasks))
    
        if len(tasks) > 0:
            # resend the task to execute at least 1 second from now
            amass.delay(results, tasks, countdown=1)
        else:
            # we done
            print results
    

    Use Case:

    tasks = []
    
    for i in xrange(10):
        tasks.append(power.delay(i, 2))
    
    amass.delay([], tasks)
    

    What this should do is start all of the tasks as soon as possible asynchronously. Once they've all been posted to the queue, the amass task will also be posted to the queue. The amass task will keep reposting itself until all of the other tasks have been completed.

提交回复
热议问题