我有一个 Flask 应用程序,其中包含一些存储在数据库中的用户可修改的配置值。 这些值不会经常更改,因此我不想每次收到请求时都从数据库中获取它们(每个请求都需要这些值),但我还需要将更改立即传播到所有工作人员。
我提出的解决此问题的两种通用方法是:
- 以某种方式拥有可由每个工作人员修改的值的共享本地副本。然后,当用户更改值时,worker 将更新数据库和本地变量。对于这种方法,
搁置
可能是一个不错的选择。 - 以某种方式通知每个工作人员需要从数据库重新加载值。
最好的方法是什么?
(注意:该应用程序由 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/