我遇到这样一种情况:定期每月small_task_1
读取一个文件,并在此文件中每行排队一个链式任务,其中链接任务为small_task_2
和class BigTask(PeriodicTask):
run_every = crontab(hour=00, minute=00, day_of_month=1)
def run(self):
task_list = []
with open("the_file.csv" as f:
for row in f:
t = chain(
small_task_1.s(row),
small_task_2.s(),
)
task_list.append(t)
gr = group(*task_list)
r = gr.apply_async()
:
small_task
我想获得每个chord
的排队,失败任务数量(以及有关异常的详细信息)的统计信息,只要所有这些任务完成(无论是什么)状态是)将摘要电子邮件发送给项目管理员。
我首先考虑使用callback
,但如果任何headers
任务失败,则不会执行r.get()
,这肯定会发生在我的情况下。
我也可以在BigTask
中使用shared.service.ts
,非常方便,但不建议等待任务结果进入另一个任务(即使在这里,我猜工人死锁的风险很低,因为任务每月只执行一次。)
重要提示:输入文件包含约700k行。
你会如何建议继续?
答案 0 :(得分:1)
我不确定它是否可以帮助您监控,但是您可以使用chord
和callback
问题link_error回调(用于捕获例外)。例如,在您的情况下,您可以使用它:
small_task_1.s(row).set(link_error=error_task))
并实施向您发送通知或其他任何内容的芹菜error_task
。
在芹菜4中,您可以为所有画布设置一次(但它在3.1中对我没用):
r = gr.apply_async(link_error=error_task)
对于监控部分,您当然可以使用flower。
希望有帮助
编辑:另一种选择(不使用额外的持久性)将捕获异常并为结果和回调添加一些逻辑。例如:
def small_task_1():
try:
// do stuff
return 'success', result
except:
return 'fail', result
然后在你的回调任务中迭代结果元组并检查是否失败,因为做了实际的逻辑。
答案 1 :(得分:1)
在小组准备好之后,我发现最好的解决方案是遍历小组的结果。
发出组时,将有一个ResultSet对象。您可以.save()此对象,以稍后获取并检查.is_ready,或者可以调用.join()并等待结果。
结束时,您可以访问.results,并且具有AsyncResult对象的列表。这些对象都有一个.state属性,您可以访问该属性并检查任务是否成功。
但是,您只能在组结束后检查结果。在此过程中,您可以获取.completed_count()的值并了解小组进度。
https://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.ResultSet
答案 2 :(得分:0)
我们用于部分类似问题的解决方案,其中芹菜内置的东西(任务状态等)并没有真正削减它是在Redis中手动存储所需的信息并在需要时检索它们。