python - 在 Flask 工作线程之间共享可变数据

标签 python heroku flask shared-memory gunicorn

我有一个 Flask 应用程序,其中包含一些存储在数据库中的用户可修改的配置值。 这些值不会经常更改,因此我不想每次收到请求时都从数据库中获取它们(每个请求都需要这些值),但我还需要将更改立即传播到所有工作人员。

我提出的解决此问题的两种通用方法是:

  1. 以某种方式拥有可由每个工作人员修改的值的共享本地副本。然后,当用户更改值时,worker 将更新数据库和本地变量。对于这种方法,搁置可能是一个不错的选择。
  2. 以某种方式通知每个工作人员需要从数据库重新加载值。

最好的方法是什么?

(注意:该应用程序由 Gunicorn 在 Heroku Hobby Dyno 上提供服务。)

最佳答案

最后,我了解了 Python 的 multiprocessing 模块,该模块除其他外还提供了一种在进程之间共享内存的相当简单的方法。

就我而言,我需要共享一个字符串,因此我使用以下命令初始化了一个共享字符串

import multiprocessing as mp
...
shared_str = mp.Array('c', 100)

这会为长度为 100 的共享 c 字符串创建一个包装器。multiprocessing.Array 构造函数采用类型参数(ctypes 类或 type-code string和长度。然后我可以使用 shared_str.value 访问共享字符串。

我使用 --preload 选项运行 gunicorn ,因此在创建我的应用程序时分配共享内存,然后每个进程都可以使用自己的副本访问它shared_str

此方法也适用于其他 ctypes 对象(甚至非 ctypes 对象,使用 pickle)。请参阅多处理 here 的文档,具体来说,sharedctypes submodule .

关于python - 在 Flask 工作线程之间共享可变数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53916238/

相关文章:

Python NumPy : reshape is deprecated

python - 按月份名称对 Pandas 数据框系列进行排序

python - Ubuntu Unity 下 PyGTK 菜单不显示?

git - 从同一个 git repo 部署两个单独的 heroku 应用程序

python - 不可 JSON 序列化 - Python + Flask + Sqlalchemy

python - Apache 上的 Flask 应用程序,CentOs 抛出 mod_fcgid : error reading data from FastCGI server

java - 如何从java正确运行python?

node.js - 设置本地heroku环境变量的问题

ruby-on-rails - Heroku Rails 控制台写入本地文件

python - 在WTForms中使用自定义属性创建selectfield选项