【问题标题】:Celery Exception Handling芹菜异常处理
【发布时间】:2017-08-10 10:25:48
【问题描述】:

假设我有这个任务定义:

def some_other_foo(input)
raise Exception('This is not handled!')
return input

@app.task(
  bind=True,
  max_retries=5,
  soft_time_limit=20)
def some_foo(self, someInput={}):
   response=""
   try:
     response = some_other_foo(someInput)
   except Exception as exc:
     self.retry(countdown=5, exc=exc)
     response="error"
 return response

我有一个问题,在 some_foo 中没有处理异常,我得到错误而不是 response="error",任务崩溃并且我得到指示引发异常的 Traceback。

是否可以正常返回,但是设置celery任务失败,结果花会失败?

我正在使用:
芹菜 4.1
AMPQ 作为经纪人
芹菜花作为监控

【问题讨论】:

    标签: python python-2.7 celery celeryd


    【解决方案1】:

    Try \ except 工作正常。你的任务永远不会成功,因为你在return 之前调用了self.retry。让我们做一个小测试:

    from celery import Celery
    
    app = Celery(name_app,broker_settings_etc....)
    
    def some_other_foo(value):
        raise Exception('This is not handled!')
    
    @app.task(
      bind=True,
      max_retries=5,
      soft_time_limit=20)
    def some_foo(self):
        response = ""
    
        try:
            response = some_other_foo('test')
        except Exception as exc:
            self.retry(countdown=5, exc=exc)
            response = "error"
    
        return response
    

    运行 celery 应用并调用我们的任务。您将在 celery 日志中看到如下内容:

    3fb-81de-e4149fa88f4c] retry: Retry in 5s: Exception('This is not handled!',)
    [2017-08-18 15:50:34,160: INFO/MainProcess] Received task: tasks.some_foo[b656731b-c85d-43fb-81de-e4149fa88f4c] eta:[2017-08-18 12:50:39.156912+00:00]
    [2017-08-18 15:50:34,161: INFO/MainProcess] Task tasks.some_foo[b656731b-c85d-43fb-81de-e4149fa88f4c] retry: Retry in 5s: Exception('This is not handled!',)
    [2017-08-18 15:50:39,511: ERROR/MainProcess] Task tasks.some_foo[b656731b-c85d-43fb-81de-e4149fa88f4c] raised unexpected: Exception('This is not handled!',)
    Traceback (most recent call last): 
    # trace here...
    Exception: This is not handled!
    

    它是如何工作的。您为任务max_retries=5 设置。当您调用self.retry(countdown=5, exc=exc) 时,Celery 会中断任务处理并尝试使用countdown(在我们的示例中为 5)重新启动任务。 5 次尝试后(max_retries) Celery 不会重新运行任务。

    现在,让我们将 try \ except 块更改为:

    try:
        response = some_other_foo('test')
    except Exception:
        print 'handled'
        response = "bad response"
    

    重启 Celery 并运行我们的任务。让我们检查一下日志:

    [2017-08-18 15:58:41,893: INFO/MainProcess] Received task: tasks.some_foo[1437e7ce-1c69-4042-824b-5602f486c025]
    [2017-08-18 15:58:41,895: WARNING/Worker-3] handled
    [2017-08-18 15:58:41,896: INFO/MainProcess] Task tasks.some_foo[1437e7ce-1c69-4042-824b-5602f486c025] succeeded in 0.00186271299026s: 'bad response'
    

    如您所见,处理程序工作正常。

    所以,总结一下。如果你调用self.retry,Celery 将中断任务处理并尝试重新启动当前任务。

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2021-09-03
      • 1970-01-01
      • 2014-10-02
      相关资源
      最近更新 更多