首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是正确的方式使用瓶-Sqlalchemy与多处理?

什么是正确的方式使用瓶-Sqlalchemy与多处理?
EN

Stack Overflow用户
提问于 2022-04-23 22:16:00
回答 1查看 245关注 0票数 1

我在我的烧瓶应用程序中有一条路径,它产生一个进程(使用multiprocessing.Process)来做一些背景工作。该进程需要能够写入数据库。

__init__.py:

代码语言:javascript
运行
复制
from flask_sqlalchemy import SQLAlchemy
from project.config import Config

db = SQLAlchemy()

# app factory
def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)
    db.init_app(app)
    return app

这是相关的代码,说明了我是如何生成进程并使用db连接的:

代码语言:javascript
运行
复制
def worker(row_id):    
    db_session = db.create_scoped_session()

    # Do stuff with db_session here

    db_session.close()

@app.route('/worker/<row_id>/start')
def start(row_id):
    p = Process(target=worker, args=(row_id,))
    p.start()
    return redirect('/')

问题是,有时(并不总是)我会犯这样的错误:

代码语言:javascript
运行
复制
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) insufficient data in "D" message lost synchronization with server: got message type "a", length 1668573551

我假设这与另一个进程访问数据库有关(因为如果我不使用单独的进程,一切都很好),但老实说,我找不到修复它的方法。正如您在我的代码中所看到的,我尝试使用create_scoped_session()方法来解决这个问题,但问题是一样的。

有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2022-04-24 00:11:51

好的,我遵循@antont的提示,以这种方式在worker函数中创建了一个新的sqlalchemy会话,它运行得完美无缺:

代码语言:javascript
运行
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

def worker(row_id):    
    db_url = os.environ['DATABASE_URL']
    db_engine = create_engine(db_url)
    Session = sessionmaker(bind=db_engine)
    db_session = Session()

    # Do stuff with db_session here

    db_session.close()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71984014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档