python - Celery 任务的finally 子句不执行,我该如何清理?

标签 python celery

我有一个 celery 任务,其中有一个 finally 子句。我发现有时该子句不会执行。我认为当任务超时时就会发生这种情况,看起来 celery 杀死了它。

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

这对任务成功不起作用,但我可以使用现有的finally语句来实现这一点,并且如果它也适用于超时,则只需调用on_failure中的清理代码即可。清理代码是幂等的。

我考虑使用链来执行一个新任务来执行清理,但第二个任务只有在第一个任务成功时才会执行。

我浏览了文档并找到了一个 on_failure 任务方法(参见 https://gist.github.com/darklow/c70a8d1147f05be877c3 )我可以超越 - 但我无法确定它是否会在超时时执行?

简而言之:我需要一种方法来让代码在任务完成后执行 - 无论是成功、失败还是超时。

最佳答案

如果您担心超时,为什么不捕获 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()

关于python - Celery 任务的finally 子句不执行,我该如何清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798248/

相关文章:

Python通过pyodbc在Access中的十进制数中插入一个冒号

WinXP 中的 Python setuptools 退出安装并出现无信息错误

python - 我们可以在 Python 中添加 'OR' 运算符以及 if 和 else 吗?

python - jinja2 访问字典中的嵌套列表

python - Django celery 任务在 celery 服务器启动时立即运行

python - 在 Celery 任务中所做的数据库更改在主线程中不可见

python - 当 celery worker 死亡时收到通知

python - 如何在模板中显示来自 django 中 2 个模型的数据以及一对多关系

python - celery :中止或撤销和弦中的所有任务

django - 在 django 中使用 celery 和 ffmpeg 转码视频