Celery任务的finally子句不执行,如何清除?

时间:2019-06-27 20:44:40

标签: python celery

我有一个芹菜任务,其中包含finally子句。我发现有些时候该子句不执行。我认为这种情况会在任务超时时发生,并且似乎芹菜会杀死它。

在芹菜任务之后执行代码的最佳实践是什么-无论如何?

这不能成功完成任务,但是我可以使用现有的finally语句,并且只要它也适用于超时,就可以在on_failure中调用清除代码。清除代码是幂等的。

我考虑过使用链执行一个新任务,该任务将执行清理-但第二个任务只有在第一个任务成功的情况下才会执行。

我浏览了一下文档,发现了一个on_failure任务方法(请参阅https://gist.github.com/darklow/c70a8d1147f05be877c3),我可以克服麻烦-但我不确定该超时执行吗?

简而言之:我需要一种使代码在任务完成后执行的方法-成功,失败还是超时。

1 个答案:

答案 0 :(得分:1)

如果您担心超时,为什么不赶上SoftTimeLimitExceeded

from celery.exceptions import SoftTimeLimitExceeded

@app.task(name='my_task', soft_time_limit=1000, time_limit=2000)
def my_task():
    try:
        do_stuff()
    except SoftTimeLimitExceeded:
        raise
    finally:
        do_some_cleanup.delay()
相关问题