Python 正确管理SQLAlchemy和芹菜芹菜任务中的postgresql连接
我在用炼金术,芹菜和uWSGI 我知道炼金术会自动为您管理会话。我不确定这对芹菜工人是如何工作的,但当我第二次运行任务时,似乎会出现以下错误:DatabaseError:(psycopg2.DatabaseError)服务器意外关闭了连接 以下是我如何创建应用程序上下文和芹菜任务: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
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)。我正在尝试遵循您的模式。你是如何开始这种模式的芹菜工人的?