如何在发生操作错误时重试所有芹菜任务?

时间:2018-03-06 18:24:55

标签: python django postgresql celery

偶尔重新启动postgres时,由于OperationalError s,我从Celery那里得到了大量错误。比如:

File "/var/www/.virtualenvs/xxx/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
  return self.cursor.execute(sql, params)
OperationalError: terminating connection due to administrator command
SSL connection has been closed unexpectedly

有没有办法自动重启任何以这种方式结束的芹菜任务,可能有30秒延迟或什么?我正在使用redis作为我的经纪人。

我可以在我的任务中发现这种错误,但这意味着在try / except中包装每个数据库命令,这将是一种可怕的。

1 个答案:

答案 0 :(得分:1)

芹菜Preview of Main Report任务失败。您可以将延迟配置为任务级别的默认值,如果需要,还可以基于每个例外进行配置。

@app.task(bind=True, default_retry_delay=30)  # retry in 30 seconds.
def add(self, x, y):
    try:
        something_risky()
    except Exception as exc:
        # overrides the default delay to retry after 1 minute
        raise self.retry(exc=exc, countdown=60)

如果您只想重试OperationalError(或其他特定错误),您可以指定

@app.task(autoretry_for=(OperationalError,))

还可以通过retry_backoff参数内置对supports retrying的支持,这可能对您的情况有用。

@app.task(autoretry_for=(OperationalError,), retry_backoff=True)