Multithreading Flask:多线程时如何写入SQLAlchemy DB?
我在Flask应用程序中使用多线程,希望每个线程都附加到数据库中的一个条目中。然而,我永远无法让它工作。根据,我有如下内容:Multithreading Flask:多线程时如何写入SQLAlchemy DB?,multithreading,flask,sqlalchemy,python-multithreading,Multithreading,Flask,Sqlalchemy,Python Multithreading,我在Flask应用程序中使用多线程,希望每个线程都附加到数据库中的一个条目中。然而,我永远无法让它工作。根据,我有如下内容: def test(arg): some_session.execute(text('update testtable set value = value||"a" where id == 1')) some_session.commit() with app.test_request_context(): executor.m
def test(arg):
some_session.execute(text('update testtable set value = value||"a" where id == 1'))
some_session.commit()
with app.test_request_context():
executor.map(test,'arg')
这将在多个线程中调用test()。如果我只是运行some_session.execute(text('updatetesttable set value=value | | | |“a”其中id=1'))
和some_session.commit()
,而不是在多线程中运行的函数中运行,那么这就可以正常工作
以下是我的完整测试代码:
from flask import Flask
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from flask_executor import Executor
import concurrent.futures
from sqlalchemy.sql import text
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///testdb.sqlite3'
app.config.from_object(__name__)
Session(app)
db = SQLAlchemy(app)
engine = create_engine('sqlite:///testdb.sqlite3', echo=True)
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
some_session = Session()
executor = Executor(app)
class testtable(db.Model):
id = db.Column('id', db.Integer, primary_key = True)
value = db.Column(db.String(100))
def __init__(self, value):
self.value = value
db.create_all()
entry = testtable('x')
db.session.add(entry)
db.session.commit()
# works
some_session.execute(text('update testtable set value = value||"PLEASEHELP" where id == 1'))
some_session.commit()
def test(arg):
some_session.execute(text('update testtable set value = value||"y" where id == 1'))
some_session.commit()
with app.test_request_context():
executor.map(test,'arg')
Session.remove()
if __name__ == '__main__':
db.create_all()
app.run(debug = True)
如何正确执行此操作?您是否尝试过在测试函数中创建和删除会话?