首页 > 解决方案 > 在内存中预加载数据并在 Python Flask 进程/工作者之间共享

问题描述

我想知道在生产中启动烧瓶服务器(即使用 gunicorn 或其他 WSGI HTTP 服务器)时,是否有办法预加载巨大的共享只读数据结构。如果我在每次请求时都这样做,这个数据加载过程会花费太多时间,所以我需要预加载并向我的客户提供他们需要的所有信息。这样做的正确、高效和最佳实践方式是什么?

以下是我当前服务器代码的一些详细信息:

  1. 它读取一个巨大的文件并在服务器脚本执行开始时构建一个字典列表。
  2. 这种结构在整个服务器脚本中就像一个全局只读资源。
  3. 资源文件由一组加载在内存中的巨大 shapefile 结构组成。
  4. 在调试模式下使用 python 解释器运行时它工作正常,可能是因为它只实例化数据一次。
  5. 当使用 gunicorn 运行时,它会变得非常慢并且可能会崩溃,我什至不能使用其他工作人员,否则他们将消耗所有易失性内存资源。

简化一下,我的服务器脚本代码如下所示:

from flask import Flask, jsonify
import serverinfo
import api

app = Flask(__name__.split('.')[0])

@app.route("/api/getinfo/<coordinates>", methods=['GET'])
def getinfo(coordinates):
    for m in api.MAPS:
        if check_collision(coordinates, m):
            return jsonify(m['details']), 200
    return jsonify({'err' : 'no results'}), 400

#... other stuff

if __name__ == '__main__':
    app.run(host=serverinfo.host, port=serverinfo.port)

api.__init__.py 看起来像这样:

import pickle

#... other stuff

def load_maps():
    maps = []
    with open(MAPPATH, "rb") as box_file:
        box_res = pickle.load(box_file)
        for res in box_res:
            m = Map(*res)
            maps.append(m)
    return maps

#... other stuff

MAPS = load_maps()

标签: pythonflaskshared-memory

解决方案


推荐阅读