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

Celery 将生成的列表映射到芹菜中的任务的最佳方法,celery,celery-task,celeryd,Celery,Celery Task,Celeryd,我正在寻找一些建议,以最好的方式将一个任务生成的列表映射到芹菜中的另一个任务 假设我有一个名为parse的任务,它解析PDF文档并输出页面列表。然后,需要将每个页面分别传递给另一个名为feed的任务。这一切都需要进入一个名为process 因此,我可以这样做: @celery.task def process: pages = parse.s(path_to_pdf).get() feed.map(pages) 当然,这不是一个好主意,因为我正在任务内部调用get() 此外,

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

假设我有一个名为
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()
。此外,这个例子过于简单,我真的需要在所有页面都被输入后做一些事情(即在
和弦中)

我正在寻找最理想的方法来做芹菜这一点。如果您有任何建议,我将不胜感激


谢谢

这对您来说可能太晚了,但您可能希望使用任务链:

@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)

事实上,我就是这样做的,直到今天还在用这种方式。提供一个好的答案永远不会太迟,这将有助于他人。谢谢。干杯@chaimp,我只是在寻找另一个问题的答案时偶然发现了这个问题,最近我只需要自己解决这个问题;)