我该如何在芹菜中实现taskset的回调

时间:2012-05-26 15:51:42

标签: django celery djcelery

问题

我使用芹菜来启动看起来像这样的任务集:

  1. 我执行一批可以并行运行的任务,这批任务的数量从几十到几千不等。
  2. 我将这些任务的结果汇总到单个答案中,然后用这个答案做一些事情---比如存储到数据库,保存到特殊结果文件等等。基本上在完成任务后我必须调用具有以下签名的函数:

    def callback(result_file_name, task_result_list): 
        #store in file
    
    
    def callback(entity_key, task_result_list):
        #store in db 
    
  3. 现在步骤1.在Celery队列中完成,第2步在芹菜外完成:

        tasks = []
    
        # add taksks to tasks list 
    
        task_group = group()
        task_group.tasks = tasks
    
        result = task_group.apply_async()
    
        res = result.join()
    
        # Aggregate results 
    
        # Save results to file, database whatever
    

    这种方法很麻烦,因为我必须停止一个线程,直到执行所有任务(可能需要几个小时)。

    我想以某种方式将步骤2转移到芹菜上 - 基本上我需要为整个任务集添加一个回调(据我所知,它在Celery中不受支持)或者提交一个在所有这些之后执行的任务子任务。

    有谁知道怎么做?我在django环境中使用它,所以我可以在数据库中存储一些状态。

    总结我最近的发现

    和弦不会

    我不能直接使用和弦,因为和弦使我能够以这种方式创建回调:

        def callback(task_result_list): 
            #store in file
    

    没有明显的方法可以将其他参数传递给回调(特别是因为这些回调不能是本地函数)。

    使用数据库

    我可以使用TaskSetMeta存储结果,但是这个实体没有状态字段---所以即使我要向TaskSetMeta添加信号,我也必须汇集任务结果,这可能会产生巨大的开销。

1 个答案:

答案 0 :(得分:3)

答案非常简单,我确实可以使用和弦---其他参数(如报告文件名等)必须作为kwargs传递。

这是和弦任务:

@task
def print_and_sum(to_sum, file_name):
    print file_name
    print sum(to_sum)
    return file_name, sum(to_sum)

以下是如何实例化它:

subtasks = [...]
result = chord(subtasks)(print_and_sum.subtask(kwargs={'file_name' : 'report_file.csv'}))