Я изо всех сил стараюсь, чтобы мои настройки 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
/ 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)
приложение / __ 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)