在 Flask worker 之间共享可变数据
Share mutable data between Flask workers
我有一个 Flask 应用程序,其中包含一些存储在数据库中的用户可修改的配置值。
这些值不会经常更改,所以我不想每次收到请求时都从数据库中获取它们(每个请求都需要这些值),但我还需要立即将更改传播给所有工作人员。
我想出的解决这个问题的两种通用方法是:
- 以某种方式拥有可由每个工作人员修改的值的共享本地副本。然后当用户更改值时,worker 将同时更新数据库和局部变量。
shelve
可能是这种方法的不错选择。
- 以某种方式通知每个工作人员需要从数据库重新加载值。
最好的方法是什么?
(注意:该应用程序由 Gunicorn 在 Heroku Hobby Dyno 上提供。)
最后我了解了 Python 的 multiprocessing
模块,它提供了一种在进程之间共享内存的相当简单的方法。
在我的例子中,我需要共享一个字符串,所以我用
初始化了一个共享字符串
import multiprocessing as mp
...
shared_str = mp.Array('c', 100)
这为长度为 100 的共享 C 字符串创建了一个包装器。multiprocessing.Array
构造函数采用类型参数(ctypes
class 或 type-code string和长度。然后我可以使用 shared_str.value
.
访问共享字符串
我 运行 gunicorn
带有 --preload
选项,因此共享内存是在创建我的应用程序时分配的,然后每个进程都可以使用自己的 shared_str
.
此方法也适用于其他 ctypes
对象(甚至非 ctypes
对象,使用 pickle
)。请参阅 multiprocessing
here, and specifically, the sharedctypes
submodule.
的文档
我有一个 Flask 应用程序,其中包含一些存储在数据库中的用户可修改的配置值。 这些值不会经常更改,所以我不想每次收到请求时都从数据库中获取它们(每个请求都需要这些值),但我还需要立即将更改传播给所有工作人员。
我想出的解决这个问题的两种通用方法是:
- 以某种方式拥有可由每个工作人员修改的值的共享本地副本。然后当用户更改值时,worker 将同时更新数据库和局部变量。
shelve
可能是这种方法的不错选择。 - 以某种方式通知每个工作人员需要从数据库重新加载值。
最好的方法是什么?
(注意:该应用程序由 Gunicorn 在 Heroku Hobby Dyno 上提供。)
最后我了解了 Python 的 multiprocessing
模块,它提供了一种在进程之间共享内存的相当简单的方法。
在我的例子中,我需要共享一个字符串,所以我用
初始化了一个共享字符串import multiprocessing as mp
...
shared_str = mp.Array('c', 100)
这为长度为 100 的共享 C 字符串创建了一个包装器。multiprocessing.Array
构造函数采用类型参数(ctypes
class 或 type-code string和长度。然后我可以使用 shared_str.value
.
我 运行 gunicorn
带有 --preload
选项,因此共享内存是在创建我的应用程序时分配的,然后每个进程都可以使用自己的 shared_str
.
此方法也适用于其他 ctypes
对象(甚至非 ctypes
对象,使用 pickle
)。请参阅 multiprocessing
here, and specifically, the sharedctypes
submodule.