如何从Django芹菜中恢复与Postgres的联系

时间:2013-08-14 21:53:09

标签: django postgresql django-celery

我正在使用Redis代理和数据库结果后端运行Django Celery,这是我用于主应用程序的Postgres数据库。

最近我遇到了Postgres服务器重启并且工作进程丢失数据库连接的情况。在这种情况发生之后,即使DB恢复并且主Django站点正常响应,也没有芹菜任务再次成功。我需要在处理任何内容之前重新启动celeryd进程。所有芹菜任务都报告相同的错误:

DatabaseError: terminating connection due to administrator command
SSL connection has been closed unexpectedly

据我所知,当使用db结果后端Celery无法报告失败时,外部看起来这些任务从未执行但我不明白后续任务失败的原因。 Celery文档说它不会在任务之间保持DB连接,因此新任务应该建立新连接。

那么,为什么会发生这种情况呢?数据库连接是否存在较低级别的持久性?我怎样才能让芹菜重试这些任务?

1 个答案:

答案 0 :(得分:3)

我通过在所有celery任务中添加一个after_return处理程序来解决这个问题,以便在每次执行后关闭数据库连接。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#abstract-classes

class DBTask(celery.Task):
    abstract = True

    def after_return(self, *args, **kwargs):
        connection.close()

@celery.task(base=DBTask)
def mytask():
    # Do Stuff with DB