【发布时间】: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