5

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

假设我有一个名为 的任务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()该示例仍然涉及在任务内部调用。此外,这个例子过于简单化了,我真的需要在所有页面都被输入之后做一些事情(即在 a 中chord)。

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

谢谢!

4

1 回答 1

8

这对你来说可能已经太晚了,但你可能想要使用任务链:

@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)
于 2015-10-13T15:15:20.453 回答