将生成的列表映射到芹菜中的任务的最佳方法

时间:2013-04-30 03:35:03

标签: celery celery-task celeryd

我正在寻找一些建议,以便将从任务生成的列表映射到芹菜中的另一个任务的最佳方法。

我们说我有一个名为parse的任务,它解析PDF文档并输出一个页面列表。然后,每个页面都需要单独传递给另一个名为feed的任务。这一切都需要进入名为process

的任务

所以,我能做到的一点是:

@celery.task
def process:
    pages = parse.s(path_to_pdf).get()

    feed.map(pages)

当然,这不是一个好主意,因为我在任务中调用get()

此外这是低效的,因为我的parse任务包含在生成器函数中并且能够生成页面,这意味着应该可以将第一页排队以便在最后一页之前进行排序已由解析器产生。

另一种可能性是这样做:

@celery.task
def process:
    for page in parse.s(path_to_pdf).get():
        feed.delay(page)

该示例仍涉及在任务中调用get()。另外,这个例子过于简单化,我真的需要在所有页面都被输入后做一些事情(即在chord中)。

我正在寻找在芹菜中做到这一点的最佳方法。我很感激任何建议。

谢谢!

1 个答案:

答案 0 :(得分:6)

这对您来说可能为时已晚,但您可能想要使用任务链:

@celery.task
def process():
    return chain(parse.s(), feed_map.s())

@celery.task
def feed_map(pages):
    return feed.map(pages)

如果你有一些最后的任务,比如final,你可以这样做:

@celery.task
def feed_map(pages):
    return chord(feed.map.s(page) for page in pages, final.s)