我是芹菜的新手。我正在努力使分布式任务与芹菜一起工作。
假设我的任务文件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
有一些替代,我可以在生成器产生第一个作业时立即从生成器添加,而不是在我最终开始做一些工作之前等待生成器获取所有内容。
答案 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