Celery在准备好时将任务添加到队列中

时间:2014-10-08 21:16:48

标签: python celery

我是芹菜的新手。我正在努力使分布式任务与芹菜一起工作。

假设我的任务文件task.py中有一项任务:

@celery.task
def generate_sorts(params,meta_data_dict):
    '''
    This will generate some sorts .
    '''
    pass

我正在执行以下操作作为分布式处理的一部分:

taskset = TaskSet(
    tasks.generate_sorts.subtask(args = (params, meta_data_dict))
    for meta_data_dict in chunk_generator)

print "Dispatching tasks"
taskset_result = taskset.apply_async()

print "Waiting for results"
results = taskset_result.join_native()
print "Results:"
#Process the results. 

现在chunk_generator基本上是一个生成器模式,它进入数据库并获取一些元数据。我现在的问题是这些任务在最终发送到任务队列之前累积。在将任务实际添加到队列之前,我的生成器需要大约30分钟才能获取所有元数据。我知道这是TaskSet打算执行的方式。我正在寻找TaskSet的替代品,即我能够以分布式方式执行以下等效操作。

pool.imap_unordered(generate_sorts, chunk_generator)

一旦生成器产生结果,上面将执行generate_sots。换句话说,TaskSet有一些替代,我可以在生成器产生第一个作业时立即从生成器添加,而不是在我最终开始做一些工作之前等待生成器获取所有内容。

1 个答案:

答案 0 :(得分:1)

您应该尝试立即启动它们并将AsyncResult的结果实例添加到ResultSet

from celery.result import ResultSet

result_set = ResultSet()
for meta_data_dict in chunk_generator:
    # Add the task to the queue immediately
    result = task.generate_sorts.delay(params, meta_data_dict)
    result_set.add(result)

print "Waiting for results"
results = result_set.join_native()
print "Results:"
# Process the results