Python 正确管理SQLAlchemy和芹菜芹菜任务中的postgresql连接

Python 正确管理SQLAlchemy和芹菜芹菜任务中的postgresql连接,python,postgresql,flask,celery,flask-sqlalchemy,Python,Postgresql,Flask,Celery,Flask Sqlalchemy,我在用炼金术,芹菜和uWSGI 我知道炼金术会自动为您管理会话。我不确定这对芹菜工人是如何工作的,但当我第二次运行任务时,似乎会出现以下错误:DatabaseError:(psycopg2.DatabaseError)服务器意外关闭了连接 以下是我如何创建应用程序上下文和芹菜任务: def make_celery(app): celery = Celery( app.import_name, backend=app.config['CELERY_BACKE

我在用炼金术,芹菜和uWSGI

我知道炼金术会自动为您管理会话。我不确定这对芹菜工人是如何工作的,但当我第二次运行任务时,似乎会出现以下错误:DatabaseError:(psycopg2.DatabaseError)服务器意外关闭了连接

以下是我如何创建应用程序上下文和芹菜任务:

def make_celery(app):
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_BACKEND'],
        broker=app.config['CELERY_BROKER_URL'],
    )
    celery.conf.update(app.config)
    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery
看起来可能工作人员正在使用相同的数据库连接,并且在任务完成后,该连接没有被补充

这可能与什么有关


我不知道如何正确设置workers或芹菜,以便他们使用到数据库的新连接。

好的。我发现,对于使用应用程序上下文的每个进程,都必须使用新的应用程序上下文。以前,在我的
app/_init__.py
中,我只是在全局创建应用程序,如下所示:

from flask import Flask
app = Flask(__name__)
然后我将我的应用程序更改为使用create_应用程序,如中所示

现在,my tasks.py如下所示:

from myapp import create_app
from celery import Celery
def make_celery(app=None):
    app = app or create_app()
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_BACKEND'],
        broker=app.config['CELERY_BROKER_URL'],
    )
    celery.conf.update(app.config)
    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery

celery = make_celery()

确保在创建应用程序中您正在调用db.init\u应用程序(app)。

我正在尝试遵循您的模式。你是如何开始这种模式的芹菜工人的?