【发布时间】:2020-03-30 06:05:24
【问题描述】:
我正在构建一个应用程序,用户偶尔会在其中启动一个运行时间较长的进程。运行时,该进程将提交对数据库条目的更新。
由于这个过程需要一些时间,我使用threading 模块来执行它。但是在线程中更新的值永远不会真正提交。
一个例子:
from flask import Flask, url_for, redirect
from flask_sqlalchemy import SQLAlchemy
import time, threading, os
if os.path.exists('test.db'): os.remove('test.db')
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
value = db.Column(db.Integer)
def __init__(self, value): self.value = value
db.create_all()
item = Item(1)
db.session.add(item)
db.session.commit()
@app.route('/go', methods=['GET'])
def go():
def fun(item):
time.sleep(2)
item.value += 1
db.session.commit()
thr = threading.Thread(target=fun, args=(item,))
# thr.daemon = True
thr.start()
return redirect(url_for('view'))
@app.route('/view', methods=['GET'])
def view(): return str(Item.query.get(1).value)
app.run(host='0.0.0.0', port=8080, debug=True)
我的期望是该项目的值将在两秒后异步更新(当fun 完成时),并且对/view 的额外请求将显示更新的值。但这永远不会发生。我不是线程模块中发生的事情的专家;我错过了什么吗?
我已经尝试设置thr.daemon=True,正如一些帖子中指出的那样;但事实并非如此。我找到的最接近的 SO 帖子是 this one;该问题没有最小且可验证的示例,也没有得到回答。
【问题讨论】:
标签: python multithreading flask sqlalchemy flask-sqlalchemy