您是否可以为特定任务预留一定数量的芹菜工人,或者在延迟任务时将任务设置为更高优先级?

时间:2017-05-26 18:18:43

标签: django celery

我的django应用程序当前接收一个文件,并逐行读取文件,对于每一行,有一个芹菜任务委托处理该行。

这有点像是什么样的

File -> For each line in file -> celery_task.delay(line)

现在,我还有其他可以由用户触发的芹菜任务,例如:

User input line -> celery_task.delay(line)

这当然不是完全相同的任务,用户本质上可以根据他们的行为调用任何芹菜任务(信号也会调用某些任务)

现在我面临的问题是,当用户上传一个相对较大的文件时,我的redis队列会因处理文件而变得困惑,当用户做任何事情时,他们的任务将被委派并仅在文件的后面执行celery_task.delay()任务完成执行。我的问题是,是否可以保留一定数量的工作人员或推迟具有“更高”优先级的芹菜任务并覆盖队列?

以下是代码的一般情况:

@app.task(name='process_line')
def process_line(line):
    some_stuff_with_line(line)
    do_heavy_logic_stuff_with_line(line)
    more_stuff_here(line)
    obj = Data.objects.make_data_from_line(line)
    serialize_object.delay(obj.id)
    return obj.id

@app.task(name='serialize_object')
def serialize_object(important_id):
    obj = Data.objects.get(id=important_id)
    obj.pre_serialized_json = DataSerializer(obj).data
    obj.save()

@app.task(name='process_file')
def process_file(file_id):
    ingested_file = IngestedFile.objects.get(id=file_id)
    for line in ingested_file.get_all_lines():
        process_line.delay(line)

1 个答案:

答案 0 :(得分:1)

是的,您可以创建多个队列,然后您可以决定将任务路由到在多个工作人员或单个工作人员上运行的队列。默认情况下,所有任务都将转到名为celery的默认队列。查看Routing Tasks上的Celery文档以获取更多信息和一些示例。