用python-celery实现重试机制。
项目中需要异步执行某个任务,且失败的时候需要重试,且需要知道是否执行成功,可以这样设计。
案例代码如下:
@task()
def test_task(*args,**kwargs):
#处理逻辑
return True
def home(request):
from celery_tasks import test_task
rep = test_task.apply_async((2, 'a'), retry=True, retry_policy={
'max_retries': 3,
'interval_start': 0,
'interval_step': 0.2,
'interval_max': 0.2,
})
try:
print (rep.get())
except Exception as e:
print ('添加报错信息' + str(e)
用apply_async进行异步操作,
retry:表示是否执行。
retry_policy={
‘max_retries’: 3, #表示重试3次
‘interval_start’: 0,#表示失败后到第一次重试时的时间间隔(即什么时候第一次重试)
‘interval_step’: 0.2, #表示 每次重试之间的时间间隔
‘interval_max’: 0.2, #表示 每次重试时,时间间隔
})
rep.get() #这个是一个阻塞函数,等异步任务执行结束的时候获取异步任务函数的返回值。
当然,这样设计,个人觉得不合理,直接放在业务中阻塞的话,十分不友好。如果加上等待时间的话,阻塞时间更久。 可以增加个中间者转发。这样就避免的用户在阻塞等待了,还可以增加定时功能,修改的代码如下。
@task()
def mid_task(*args,**kwargs):
#处理逻辑
from celery_tasks import test_task
rep = test_task.apply_async((2, 'a'),countdown=100, retry=True, retry_policy={
'max_retries': 3,
'interval_start': 0,
'interval_step': 0.2,
'interval_max': 0.2,
})
try:
print (rep.get())
except Exception as e:
print ('添加报错信息' + str(e)
def home(request):
from celery_tasks import mid_task
mid_task.apply_async((2, 'a'), countdown=100)
return response