正确设置多个芹菜工人和线程的Flask-SQLAlchemy

Jab*_*abb 7 python celery flask flask-sqlalchemy

当有多个涉及多个线程的芹菜工作者都查询同一个数据库时,我正在努力使我的Flask,SQLAlchemy(mysql)和Celery设置正常工作.

问题是我无法弄清楚如何以及在何处应用所需的更改,这些更改为烧瓶应用程序和每个芹菜工作者提供了一个独立的数据库对象.

根据我的理解,需要单独的会话来避免令人讨厌的数据库错误,例如阻止其他数据库查询的不完整事务.

这是我目前的项目结构

/flask_celery.py

from celery import Celery

def make_celery(app):
    celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_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
Run Code Online (Sandbox Code Playgroud)

/app.py

#!/usr/bin/env python

import config
from app import app

app.run(port=82,debug=True, host='0.0.0.0')
#app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

应用程序/ __ init.py__

from flask import Flask
from celery import Celery
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_celery import make_celery

app = Flask(__name__)
app.config.from_object('config')
app.secret_key = app.config['SECRET_SESSION_KEY']

db = SQLAlchemy(app)
migrate = Migrate(app, db)

celery = make_celery(app)
Run Code Online (Sandbox Code Playgroud)

Lig*_*t.G 1

也许给SQLALCHEMY_BINDS一个机会。这是关于如何绑定多个数据库的指南。

恐怕你还应该采取一些额外的行动。

  • 我假设你必须config.py保存应用程序配置。SQLALCHEMY_BINDS在类中添加Config您准备的值,可能是其他几个数据库的 uri。
  • models.py如果文件存在则处理模型类。
  • 以某种方式管理你的bind_key参数(抱歉我没有详细说明)。
  • 处理bind_key对正确芹菜工作的争论...

我希望这对你有一点帮助。如果您解决了这个问题,请告诉我,以便我可以为有类似情况的人编辑这个答案。