2

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

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

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

我知道当使用 db results backend Celery 无法报告失败,因此在外部看来,这些任务似乎从未执行过,但我不明白为什么后续任务会失败。Celery 文档说它不会在任务之间保持数据库连接,因此新任务应该建立新连接。

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

4

1 回答 1

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
于 2013-09-27T20:42:43.153 回答