使用 Gunicorn 部署时如何在 Flask 方法之间共享内存资源

2023-12-30

我使用 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(使用前将#替换为@)

使用 Gunicorn 部署时如何在 Flask 方法之间共享内存资源 的相关文章

随机推荐

  • Reactor 项目和 Java 内存模型

    我试图了解 Projectreactor 为应用程序代码提供的数据可见性方面的保证 例如我预计下面的代码会失败 但经过一百万次迭代后它不会失败 我正在更改线程 A 上典型 POJO 的状态 并从线程 B 读回它 Reactor 是否保证 P
  • 想要在本机反应中自动滚动平面列表

    我正在尝试自动滚动我的平面列表 但是当我运行代码时 我无法自动滚动 如果我想手动滚动 它会在每 5 秒后到达索引 0 这是我的平面列表及其 refs 函数的所有代码 在构造函数中 this flatList1 null 并在 compone
  • 在 webpack 构建中包含 git commit 哈希值和日期

    我正在使用react es6 webpack 我想在我的应用程序中的某处显示构建日期和 git 哈希值 最好的方法是什么 你可以使用 webpack 的定义插件 https webpack js org plugins define plu
  • WPF 文本块 TargetNullValue 不起作用?

    我有一个 wpf 文本块 如下所示
  • GOTO 仍然被视为有害吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每个人都知道迪杰斯特拉 Dijkstra 给编辑的信 转到被认为有害的声明 http portal acm org citation cfm d
  • 有没有免费的lib访问html5数据库SQLite?

    该库应该易于使用来访问 html5 本地存储 sqlite 就像定义表 添加 更新 删除实体 从数据库查询实体一样 可能使用该库我可以编写如下代码 code var db new MyDataBase var users db Users
  • 为什么一个能工作,一个崩溃?

    这已经让我抓狂了一个多星期了 下面是游戏中机器人玩家的两段 Lua 代码片段比特战士 http bitfighter org 用 C 编写 使用 LuaWrapper 的变体进行绑定 当我第一次启动 Lua 脚本时 两者都完全按预期工作 但
  • REST批量删除多个项目

    我需要按批处理中的 id 删除多个项目 但是 HTTP DELETE 不支持正文有效负载 解决方案 1 DELETE path abc itemId 1 itemId 2 itemId 3 on the server side it wil
  • 气流相对导入外部 /dag 目录

    我无法将通用代码移至气流使用的 dag 目录之外 我看过气流源 https github com apache incubator airflow blob 4f20f607764bb3477419321b5dfd0c53ba1db3c0
  • 下载并保存 PDF 以供查看

    我正在尝试从我的应用程序下载 PDF 文档并将其显示在 IBooks 中 或者至少在下载完成后使其可供阅读 我按照 Xamarin 的下载示例进行操作 它允许我下载 PDF 并将其保存在本地 它也以错误的编码保存 这是我到目前为止所尝试过的
  • MongoDB NodeJS 返回子文档

    我正在尝试返回与查询字段匹配的子文档 我只想返回与用户匹配的 PIN 该 PIN 保存在帐户集合中 这就是我到目前为止所得到的 router post SelectUser async req res gt try const acc aw
  • 我的网络应用程序应该支持哪个版本的 Internet Explorer (IE) [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 由于 MS 将很快停止支持 IE 8 之前的任何内容 我不确定是否应该使我的网络应用程序与那些旧浏览器兼容 我知道仍然有人在使用它们 但我不知道是否有
  • Android 音频播放的广播意图?

    我正在尝试构建一个 Android 应用程序 它使用广播接收器来检测音乐播放何时开始 然后提供手势控制来触发发送跳过曲目意图 首先 我只想将接收器设置为在音频播放开始时触发通知 以便我可以检查这个概念是否有效 我已经在清单文件中声明了一个服
  • 如何在Python中查找n天前的日期?

    我想写一个脚本 给Python几天的时间 我们称之为d 它给了我我们的日期d几天前 我正在努力处理模块日期时间 import datetime tod datetime datetime now d timedelta days 50 a
  • Java Swing Shift+F10 辅助功能

    Per accessibility requirements Shift F10 is supposed to open right click context menus In Swing one approach is to just
  • 发送电子邮件时出现 SmtpException

    我正在尝试通过我的 C 代码发送电子邮件 但我得到SmtpException 连接尝试失败 因为连接方在一段时间后没有正确响应 或者建立的连接失败 因为连接的主机未能响应 173 194 67 109 587 这是我发送电子邮件的方式 st
  • Ansible 清单可以包含另一个清单吗?

    我们有一组在应用程序的不同实例之间共享的服务器 并希望它们的列表是一个单独的文件 以及其他特定于实例的清单包括 it 我知道 这可以通过dynamic库存 但这些是代码 我们希望保留我们的服务器列表data 可以这么说 对于 INI 库存
  • 未找到 qml XmlListModel 插件

    在我的项目中 我尝试使用 qml 内置的 Xml 列表模块 但是当我编译到手机时 出现此错误 W Qt 20100 assets qml FlickrDemo main qml 4 null assets qml FlickrDemo ma
  • @supports 的功能检测?

    如何检测浏览器是否支持 CSS supports 功能 由于 Internet Explorer 和 Safari 不支持它 因此我的 Web 应用程序不知道在这些浏览器中应用哪些样式 使用纯 CSS 您可以依靠级联来确定浏览器是否理解 s
  • 使用 Gunicorn 部署时如何在 Flask 方法之间共享内存资源

    我使用 Flask 实现了一个简单的微服务 其中处理请求的方法根据请求数据和加载到内存中的相当大的数据结构计算响应 现在 当我使用gunicorn和大量工作线程部署此应用程序时 我只想在所有工作人员的请求处理程序之间共享数据结构 由于数据只