python - 在内存中预加载数据并在 Python Flask 进程/工作者之间共享
问题描述
我想知道在生产中启动烧瓶服务器(即使用 gunicorn 或其他 WSGI HTTP 服务器)时,是否有办法预加载巨大的共享只读数据结构。如果我在每次请求时都这样做,这个数据加载过程会花费太多时间,所以我需要预加载并向我的客户提供他们需要的所有信息。这样做的正确、高效和最佳实践方式是什么?
以下是我当前服务器代码的一些详细信息:
- 它读取一个巨大的文件并在服务器脚本执行开始时构建一个字典列表。
- 这种结构在整个服务器脚本中就像一个全局只读资源。
- 资源文件由一组加载在内存中的巨大 shapefile 结构组成。
- 在调试模式下使用 python 解释器运行时它工作正常,可能是因为它只实例化数据一次。
- 当使用 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()
解决方案
推荐阅读
- python - pandas 调整 Excel 表的大小以匹配较大的表以进行比较
- css - 向上滚动时奇怪的消失网站(仅在 Chrome 中)
- reactjs - 在初始页面加载后,是否可以将当前组件作为 React.Suspense 的“后备”内容安装?
- powershell - '[' 后缺少类型名称
- tensorflow - 构建 TensorFlow 时链接 MKL 失败
- python - Python np.asarray 不返回真实形状
- wordpress - 如何将移动应用程序与 Wordpress 集成
- android - Web蓝牙:将连接网站的域名安全发送到Android App
- javascript - ReactJS jsx 从字符串加载 img URI(不起作用)
- python - Pygame 循环仅渲染最后一帧/移动