我有一个 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/