我有一个芹菜任务,其中包含finally子句。我发现有些时候该子句不执行。我认为这种情况会在任务超时时发生,并且似乎芹菜会杀死它。
在芹菜任务之后执行代码的最佳实践是什么-无论如何?
这不能成功完成任务,但是我可以使用现有的finally语句,并且只要它也适用于超时,就可以在on_failure中调用清除代码。清除代码是幂等的。
我考虑过使用链执行一个新任务,该任务将执行清理-但第二个任务只有在第一个任务成功的情况下才会执行。
我浏览了一下文档,发现了一个on_failure任务方法(请参阅https://gist.github.com/darklow/c70a8d1147f05be877c3),我可以克服麻烦-但我不确定该超时执行吗?
简而言之:我需要一种使代码在任务完成后执行的方法-成功,失败还是超时。
答案 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()