在等待长数据库查询(uWSGI)的同时释放工作人员的处理能力?

时间:2018-11-23 10:25:31

标签: nginx flask uwsgi gevent pymysql

我正在为我的公司维护API服务器,该服务器在 nginx 顶部的 uwsgi 中运行python flask 应用。

...

@app.route('/getquick', methods=["GET"])
def GET_GET_IP_DATA():
    sp_final = "CALL sp_quick()"
    cursor.execute(sp_final)

@app.route('/get_massive_log', methods=["POST"])
def get_massive_log():
    sp_final = "CALL sp_slow()"
    cursor.execute(sp_final)
...

第一个请求 / getquick 得到非常快速的处理时, / get_massive_log 可能会花费长达五秒钟的时间,这是由于冗长而复杂的mySQL查询。服务器可以处理这些查询中的几个,但是在调用太多查询时,会开始创建损坏的管道错误。

问题是,其他/ getquick请求被这些长I / O请求阻塞了。

我的经理建议我使用 gevent 来释放服务器,以便在等待mySQL查询时处理其他请求,但是我不确定自己的方向是否正确。< / p>

我正在使用 pymysql 来运行查询,谷歌似乎建议在uwsgi上使用 gevent 进行查询,但是我无法通过以下方式产生更好的结果它。

我已经在Google上搜索了几天,而当我试图了解线程,并发性,异步请求时,我不知道从哪里开始寻找解决方案。可能吗我们将不胜感激任何建议或什至指示在哪里进行研究。

编辑:也许我的问题不太清楚,所以我将尝试重述:

在等待使用uwsgi进行长数据库查询时释放工作人员的空闲空间的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您需要了解Uwsgi offloading

  

卸载是一种优化微小任务的方法,可以将它们委派给一个或多个   更多线程。

     

这些线程以非阻塞/事件方式运行此类任务,从而允许   大量并发。

您可以在docs

中了解有关卸载子系统的信息。