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() 解决了问题。