Правильная настройка Flask-SQLAlchemy для нескольких работников и потоков сельдерея - PullRequest
0 голосов
/ 28 августа 2018

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

1 Ответ

0 голосов
/ 07 сентября 2018

Может дать шанс SQLALCHEMY_BINDS. Это руководство о том, как связать несколько баз данных.

Боюсь, есть еще дополнительные шаги, которые вы должны сделать

  • Я предполагаю, что у вас есть config.py для хранения настроек приложения. Добавление SQLALCHEMY_BINDS в Config класс со значениями, которые вы подготовили, которые могут быть в нескольких других базах данных.
  • Обработка классов моделей в models.py, если файл существует.
  • Как-то управлять вашим bind_key в качестве аргумента (извините, я не уточняю это).
  • Работа с bind_key аргументом в пользу правильной работы с сельдереем ...

Надеюсь, это вам немного поможет. И, пожалуйста, дайте мне знать, если вы решите это, чтобы я мог отредактировать этот ответ для людей, которые имеют подобные случаи.

...