【问题标题】:Is doing asynchronous database calls in a flask application possible?是否可以在烧瓶应用程序中进行异步数据库调用?
【发布时间】:2017-10-19 13:47:57
【问题描述】:

我正在开发一个使用 pypyodbc 库与 Microsoft SQL 服务器交互的 Flask 应用程序。有几个页面需要很长的数据库查询才能加载页面。我们遇到了一个问题,即当 Python 等待来自数据库的答复时,没有其他请求得到服务。

到目前为止,我们以异步方式运行查询的尝试已在此测试用例中捕获:

from aiohttp import web
from multiprocessing.pool import ThreadPool

import asyncio
import _thread
pool = ThreadPool(processes=1)

def query_db(query, args=(), one=False):
    conn = pypyodbc.connect(CONNECTION_STRING)
    cur = conn.cursor()
    cur.execute(query, args)
    result = cur.fetchall()
    conn.commit()

def get(data):
    # Base query
    query = # query that takes ~10 seconds

    result = query_db(query, [])

    return result

def slow(request):
    loop = asyncio.get_event_loop()
    #result = loop.run_in_executor(None, get, [])
    result = pool.apply_async(get, (1,) )
    x = result.get()

    return web.Response(text="slow")


def fast(request):
    return web.Response(text="fast")

if __name__ == '__main__':
    app = web.Application()
    app.router.add_get('/slow', slow)
    app.router.add_get('/fast', fast)

    web.run_app(app, host='127.0.0.1', port=5561)

这不起作用,因为按该顺序请求慢速和快速页面仍然需要快速加载,直到慢速加载完成。

我试图寻找替代方案,但找不到适合我们环境的解决方案:

  • aiopg.sa 可以进行异步查询,但不能从 SQL Server 切换到 PostgreSQL
  • uwsgi 似乎可以与 Flask 一起使用以支持多线程,但它不能在 Windows 上进行 pip 安装
  • Celery 似乎与我们当前的方法相似,但它需要一个消息代理,在我们的系统上设置它并不简单

【问题讨论】:

  • 你是否尝试启用线程app.run(threaded=True)

标签: python sql-server flask pypyodbc


【解决方案1】:

听起来问题不在于 Flask 应用程序本身,而在于您的 WSGI 服务器。 Flask 旨在一次处理一个请求。要为应用程序提供服务以便多人可以同时点击它,您应该配置 WSGI 服务器以使用更多工作人员。如果在您的长流程运行时请求到达服务器,工作人员将生成应用程序的新实例并为请求提供服务。这很容易在 IIS 中设置。

当然,如果您有四个工作人员,然后四个客户端同时运行 long 函数,那么您又回到了这种情况。如果这种情况经常发生,您可以分配更多工作人员或转移到支持异步的不同 WSGI 框架,如 Quart 或 Sanic。

不过,您在上面概述的方法应该可以加快长流程的执行速度。但是 Flask 本身并不是为等待而设计的。它保持线程直到完成。

此答案中的更多详细信息:https://stackoverflow.com/a/19411051/5093960

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多