2

我遇到了一个我构建的小型 SQLite + Flask python 应用程序的问题。该应用程序通过多个端点提供 JSON 服务——一次不超过 150kb。在一些不活动之后,应用程序将需要 10-25 秒来返回通常在不到 1 秒内返回的查询。在这 10-25 秒内,对应用程序的其他查询同样被阻止。该应用程序从不写入 sqlite 数据库;它只读取它。

到目前为止,我已经尝试过:

  1. 创建一个单例以保持与数据库的单个打开连接,因此并非每个查询都必须重新打开连接。

  2. 将数据库文件本身放在内存文件系统中以加快访问时间。

  3. 增加托管文件的虚拟专用服务器上的内存(现在有很多可用内存,没有任何东西交换到磁盘)

  4. 将 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)
4

2 回答 2

2

经过多次故障排除后,我发现我设计的系统缺少一个重要组件:一个 Web 服务器网关接口 (wsgi)——如 gunicorn——用于处理烧瓶的并发性。没有它,我的开发阶段烧瓶应用程序一次只能处理一个并发请求。

在将我的烧瓶应用程序设置为围绕 gunciron 运行并部署 4 个异步工作人员来处理并发后,问题似乎立即解决了。

所有这些都在编写良好的 Flask 文档中:http: //flask.pocoo.org/docs/deploying/

于 2013-10-16T18:30:51.287 回答
1

通常,您应该在将充当反向代理的 Web 服务器(例如 nginx)后面运行 gunicorn。Nginx 接收传入的请求,并根据配置文件确定是提供静态文件还是将控制权传递给 gunicorn。

很好的解决问题!

于 2013-10-16T19:02:05.093 回答