如何监控芹菜中的一组任务?

时间:2017-08-03 12:13:17

标签: python celery

我遇到这样一种情况:定期每月small_task_1读取一个文件,并在此文件中每行排队一个链式任务,其中链接任务为small_task_2class 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行。

你会如何建议继续?

3 个答案:

答案 0 :(得分:1)

我不确定它是否可以帮助您监控,但是您可以使用chordcallback问题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中手动存储所需的信息并在需要时检索它们。