【问题标题】:Best way to map a generated list to a task in celery将生成的列表映射到芹菜中的任务的最佳方法
【发布时间】:2013-04-30 03:35:02
【问题描述】:

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

假设我有一个名为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中)。

我正在寻找在 celery 中执行此操作的最佳方法。如有任何建议,我将不胜感激。

谢谢!

【问题讨论】:

    标签: celery celery-task celeryd


    【解决方案1】:

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

    @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,我只是在寻找另一个问题的答案时遇到了它,最近才不得不自己解决这个问题;)
    • 我相信最终的回报应该是return chord(feed.s(page) for page in pages, final.s)
    猜你喜欢
    • 2017-11-06
    • 2014-06-10
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多