我在我的烧瓶应用程序中有一条路径,它产生一个进程(使用multiprocessing.Process)来做一些背景工作。该进程需要能够写入数据库。
__init__.py:
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连接的:
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('/')
问题是,有时(并不总是)我会犯这样的错误:
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) insufficient data in "D" message lost synchronization with server: got message type "a", length 1668573551
我假设这与另一个进程访问数据库有关(因为如果我不使用单独的进程,一切都很好),但老实说,我找不到修复它的方法。正如您在我的代码中所看到的,我尝试使用create_scoped_session()方法来解决这个问题,但问题是一样的。
有什么帮助吗?
发布于 2022-04-24 00:11:51
好的,我遵循@antont的提示,以这种方式在worker函数中创建了一个新的sqlalchemy会话,它运行得完美无缺:
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()
https://stackoverflow.com/questions/71984014
复制相似问题