在Flask工作人员之间共享可变数据

时间:2018-12-24 17:26:35

标签: python heroku flask shared-memory gunicorn

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

我为解决此问题提出的两种一般方法是:

  1. 以某种方式具有每个工作人员可以修改的值的共享本地副本。然后,当用户更改值时,工作程序将同时更新数据库和本地变量。 shelve可能是此方法的不错选择。
  2. 以某种方式通知每个工作人员需要从数据库中重新加载值。

什么是最好的方法?

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

1 个答案:

答案 0 :(得分:0)

最后,我了解了Python的multiprocessing模块,该模块提供了一种非常简单的方法来在进程之间共享内存。

在我的情况下,我需要共享一个字符串,所以我用初始化了一个共享字符串

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

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

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

此方法也将适用于其他ctypes个对象(甚至使用ctypes也适用于非pickle个对象)。请参阅multiprocessing here的文档,尤其是sharedctypes submodule的文档。