【问题标题】:Correctly setting up Flask-SQLAlchemy for multiple celery workers and threads为多个 celery worker 和线程正确设置 Flask-SQLAlchemy
【发布时间】:2018-08-28 07:34:59
【问题描述】:

当涉及多个线程的多个 celery 工作人员都查询同一个数据库时,我正在努力使我的 Flask、SQLAlchemy (mysql) 和 Celery 设置正常工作。

问题是我无法弄清楚如何以及在何处应用所需的更改,从而为烧瓶应用程序和每个 celery worker 提供一个独立的数据库对象。

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

这是我目前的项目结构

/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)

app/__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)

【问题讨论】:

  • 你遇到了什么错误? flask_sqlalchemy 应该可以很好地处理线程。

标签: python flask celery flask-sqlalchemy


【解决方案1】:

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

恐怕你还有额外的动作应该做。

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

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

【讨论】:

  • “绑定”选项是否适用于同一个数据库的多个绑定?文档明确提到绑定到不同的数据库后端/系统?不管怎样,谢谢你的努力。我还没有时间测试你的建议。如果这会导致合适的解决方案,我们将很乐意奖励您。可能还需要一两天的时间,直到我得到它。不幸的是,赏金将很快到期。有没有办法延长赏金时间?
  • @Jabb 绝对确定多个绑定键可以指向同一个数据库。但恐怕我误解了你的问题。我认为您可能需要多个数据库作为后端。现在我发现你所需要的只是隔离的数据库会话。正如上面评论中提到的@georgexsh,flask-sqlalchemy 应该与线程一起工作。您可能会在 Flask 范围内处理多线程。很抱歉没有提供帮助,所以没有赏金也没关系。
猜你喜欢
  • 2016-09-20
  • 2023-04-04
  • 2017-04-02
  • 1970-01-01
  • 2016-10-14
  • 2015-11-04
  • 1970-01-01
  • 2018-07-13
  • 2016-12-05
相关资源
最近更新 更多