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,我只是在寻找另一个问题的答案时偶然发现了这个问题,最近我只需要自己解决这个问题;)