Flask.socket_io 在数据库查询 运行 时阻止调用
Flask.socket_io blocking calls when database queries are run
我正在尝试将 socket_io
与我的烧瓶应用程序一起使用。问题是当我 运行 数据库查询时,就像下面的 url_route 函数一样。页面第一次正确加载但在连续调用时进程进入阻塞状态。即使 KeyboardInterrupt (Ctrl + c) 终止了 python 进程之一,我也必须手动杀死另一个。
一个明显的解决方案是使用缓存并使用另一个脚本 运行 查询数据库。是否有任何其他可能的解决方案可以避免 运行 单独的脚本?
@app.route('/status/<urlMap>')
def status(urlMap):
dictResponse = {}
data = models.Status.query.filter_by(urlmap = urlMap).first()
if data.conversion == "DONE":
dictResponse['conversion'] = 'success'
if data.published == "DONE":
dictResponse['publish'] = 'success'
return render_template('status.html',status = dictResponse)
此外,删除 import flask.ext.socketio
并使用 app.run(host='0.0.0.0')
而不是 socketio.run(app,host='0.0.0.0')
应用 运行 也很完美。所以我认为它的异步 gevent 调用以某种方式阻止了这个过程。
赞@Miguel 正确指出了问题。猴子修补标准库解决了这个问题。
monkey.patch_all()
解决了问题。
我正在尝试将 socket_io
与我的烧瓶应用程序一起使用。问题是当我 运行 数据库查询时,就像下面的 url_route 函数一样。页面第一次正确加载但在连续调用时进程进入阻塞状态。即使 KeyboardInterrupt (Ctrl + c) 终止了 python 进程之一,我也必须手动杀死另一个。
一个明显的解决方案是使用缓存并使用另一个脚本 运行 查询数据库。是否有任何其他可能的解决方案可以避免 运行 单独的脚本?
@app.route('/status/<urlMap>')
def status(urlMap):
dictResponse = {}
data = models.Status.query.filter_by(urlmap = urlMap).first()
if data.conversion == "DONE":
dictResponse['conversion'] = 'success'
if data.published == "DONE":
dictResponse['publish'] = 'success'
return render_template('status.html',status = dictResponse)
此外,删除 import flask.ext.socketio
并使用 app.run(host='0.0.0.0')
而不是 socketio.run(app,host='0.0.0.0')
应用 运行 也很完美。所以我认为它的异步 gevent 调用以某种方式阻止了这个过程。
赞@Miguel 正确指出了问题。猴子修补标准库解决了这个问题。
monkey.patch_all()
解决了问题。