我使用 Flask 实现了一个简单的微服务,其中处理请求的方法根据请求数据和加载到内存中的相当大的数据结构计算响应。
现在,当我使用gunicorn和大量工作线程部署此应用程序时,我只想在所有工作人员的请求处理程序之间共享数据结构。由于数据只是读取,因此不需要锁定或类似的操作。做这个的最好方式是什么?
本质上需要的是:
- 服务器初始化时加载/创建大数据结构
- 以某种方式在请求处理方法中获取句柄来访问数据结构
据我了解,gunicorn 允许我实现各种钩子函数,例如当服务器初始化时,但 Flask 请求处理程序方法不知道有关 Gunicorn 服务器数据结构的任何信息。
我不想为此使用 redis 或数据库系统之类的东西,因为所有数据都位于需要加载到内存中的数据结构中,并且不需要涉及反序列化。
对使用大型数据结构的每个请求执行的计算可能会很长,因此必须在每个请求的真正独立的线程或进程中同时发生(这应该通过在多核计算机上运行来扩展)。
您可以使用预加载 http://docs.gunicorn.org/en/stable/settings.html#preload-app.
这将允许您提前创建数据结构,然后分叉每个请求处理过程。这有效是因为写时复制以及你的知识只阅读从大数据结构来看。
Note:尽管这可行,但它可能只适用于非常小的应用程序或开发环境。我认为更适合生产的方法是将这些计算作为后端的任务排队,因为它们将长时间运行。然后您可以通知用户已完成的状态。
这是一个小片段来了解预加载的差异。
# app.py
import flask
app = flask.Flask(__name__)
def load_data():
print('calculating some stuff')
return {'big': 'data'}
@app.route('/')
def index():
return repr(data)
data = load_data()
跑步与gunicorn app:app --workers 2
:
[2017-02-24 09:01:01 -0500] [38392] [INFO] Starting gunicorn 19.6.0
[2017-02-24 09:01:01 -0500] [38392] [INFO] Listening at: http://127.0.0.1:8000 (38392)
[2017-02-24 09:01:01 -0500] [38392] [INFO] Using worker: sync
[2017-02-24 09:01:01 -0500] [38395] [INFO] Booting worker with pid: 38395
[2017-02-24 09:01:01 -0500] [38396] [INFO] Booting worker with pid: 38396
calculating some stuff
calculating some stuff
并与运行gunicorn app:app --workers 2 --preload
:
calculating some stuff
[2017-02-24 09:01:06 -0500] [38403] [INFO] Starting gunicorn 19.6.0
[2017-02-24 09:01:06 -0500] [38403] [INFO] Listening at: http://127.0.0.1:8000 (38403)
[2017-02-24 09:01:06 -0500] [38403] [INFO] Using worker: sync
[2017-02-24 09:01:06 -0500] [38406] [INFO] Booting worker with pid: 38406
[2017-02-24 09:01:06 -0500] [38407] [INFO] Booting worker with pid: 38407
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)