我遇到了一个我构建的小型SQLite + Flask python应用程序的问题。该应用程序通过多个端点提供JSON - 一次不超过150kb。在一些不活动之后,应用程序将花费10-25秒来返回通常在不到1秒内返回的查询。在这10-25秒期间,对应用程序的其他查询同样被阻止。该应用程序永远不会写入sqlite数据库;它只读它。
到目前为止,我已经尝试过:
创建单例以保持与数据库的单一开放连接,因此不是每个查询都必须重新打开连接。
将数据库文件本身放在内存文件系统中以加快访问时间。
增加托管文件的虚拟专用服务器上的内存(现在有大量可用内存,没有任何内容可以交换到磁盘)
将sqlite数据库的内容加载到内存中的sqlite数据库,并在每次查询时从中读取。
这些都没有解决问题,而且我已经没有选择了 - 我想解决这个问题并坚持使用SQLite,但如果不可能,我会用Postgres重构我的应用程序。
以下是读取数据库的烧瓶代码:
@app.route('/filings/<int:year>', methods=['GET'])
@crossdomain(origin='*')
def getFilings ( year ):
if request.method == 'GET':
q = 'SELECT '
for c in Filings.columns:
q = q + c + ','
q = q[:-1] # remove trailing comma
q = q + ' FROM filings'
q = q + ' WHERE filings.date LIKE \'' + str(year) + '%\''
print "about to execute sql query:"
print " " + q
con = lite.connect('/mnt/memfs/filings.db')
cur = con.cursor()
cur.execute(q)
rows = cur.fetchall()
jsonrt = [ ]
for row in rows:
d = { }
x = 0
for c in Filings.columns:
d[c] = row[x]
x = x + 1
jsonrt.append(d)
con.close()
return jsonify(items=jsonrt)
答案 0 :(得分:2)
经过多次故障排除后,我发现我错过了我设计的系统的重要组件:一个Web服务器网关接口(wsgi) - 就像gunicorn--处理烧瓶的并发性。没有它,我的开发阶段烧瓶应用程序一次只能处理一个并发请求。
在设置我的烧瓶应用程序以围绕gunciron运行并部署4个异步工作程序来处理并发后,问题似乎立即得到解决。
所有这些都在精心编写的Flask文档中:http://flask.pocoo.org/docs/deploying/
答案 1 :(得分:1)
通常,您应该在网络服务器(例如nginx)后面运行gunicorn,它将充当反向代理。 Nginx接收传入的请求,并根据配置文件确定是否提供静态文件或将控制传递给gunicorn。
解决问题很好!