Celery:当达到最大重试任务时,组中的父作业和其他任务挂起

时间:2018-02-04 05:04:08

标签: python celery celery-task flower

我将芹菜任务组合在一起,当组中的一个任务达到最大重试次数时,这些任务就会挂起。

我只是在任务正文中提出异常(即解包和验证),因为我还在试验任务的重试功能。

以下是代码:

@app.task(name='job', bind=True, queue='job')
def process_job(self, job_type, params):
    res = None
    ret = {"job_status":"SUCCESS", "job_message":"job_process_done"}
    res = group(unpack.s(params["s3_location"]), 
          validate.s(params["s3_location"]))()
    return res.get()

@app.task(name='unpack', bind=True, queue='unpack', max_retries=3, 
          default_retry_delay=1*10)
def unpack(self, s3_location):
    ret = {"unpack_status":"SUCCESS", "unpack_message":"unpack_done"}
    try:
        raise Exception("")
    except Exception, ex:
        if unpack.request.retries == unpack.max_retries:
            raise Exception('UNPACK: Max Retries Reached')
        else: unpack.retry(args=[s3_location])
    return ret

@app.task(name='validate', bind=True, queue='validate', max_retries=4, 
          default_retry_delay=1*10)
def validate(self, s3_location):
    ret = {"validate_status":"SUCCESS", 
           "validate_message":"validate_done"}
    try:
        raise Exception("")
    except Exception, ex:
        if validate.request.retries == validate.max_retries:
            raise Exception('VALIDATE: Max Retries Reached')
        else: validate.retry(args=[s3_location])
    return ret

当达到验证任务的最大重试次数时,另一个任务(解包)以及父任务(process_job)未完成。也就是说,他们的状态分别坚持'重试'和'开始'。以下是快照图片:

1。花卉显示工作状态

enter image description here

2。已达到终端显示最大重试次数的芹菜工人

enter image description here

第3。验证花卉中的详细状态

enter image description here

4。在花中解包详细状态

enter image description here

如何修复未完成的任务问题?我在任务代码/实现中做错了吗?

1 个答案:

答案 0 :(得分:0)

对于那些遇到过同样问题的人,我能够通过将每个任务的max_retries的间隙至少设为2来解决这个问题(例如,对于unpack,max_retries = 3,对于validate,max_retries = 5)。通过执行此操作,将执行其他任务的重试尝试并在try-catch块中捕获。

希望这有帮助!