python - 如何在启用多进程的 Flask 应用程序中使用全局变量

标签 python flask multiprocessing

我有一个 Flask 应用程序具有以下应用程序设置:

game_dict = load_game_dict()    
app.run(host="0.0.0.0", debug=False, threaded=False, processes=3)

这里的 game_dict 是从数据库加载的一些元数据。我们需要每周刷新一次 game_dict,所以我定义了另一个 GET 方法供管理员刷新它:

@app.route('/api/admin/reload/dict', methods=['GET'])
def api_admin_reload_dict():
    """ API for reloading game dict from database at runtime """
    global game_dict
    game_dict = load_game_dict()

我发现它不起作用,我调试并发现这次调用后的game_dict仍然保持初始值,我猜这是因为我在这里使用了processes=3。

有人知道在这种情况下如何处理吗?

谢谢

最佳答案

多个进程将无法访问彼此的内存。

但是,两个进程可以从共享实体读取数据。其中实体可以是数据库或内存中的对象或另一个进程。

如果 game_dict 没有保存太多数据,您可以在每次请求之前访问数据库,并使用新数据重新加载 game_dict 变量。

如果访问数据库获取所有 game_dict 数据的速度很慢,那么您可以设置一个计数器标志,每当数据库中的 game_dict 元数据更新时该标志就会更新,然后将当前进程的计数器与数据库的计数器进行比较并更新当前进程' 如果计数器不同,则为 game_dict 变量。

或者,您可以使用 Python 的内置 Multiprocessing Manager通过创建管理共享状态的单独服务器进程来跨进程共享状态的对象。

关于python - 如何在启用多进程的 Flask 应用程序中使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59451444/

相关文章:

python - 在进程之间进行多处理通信的最佳方式。

python - 将模块多处理与 pyaudio 结合使用

vagrant - 主管 : Why am I able to run more than 4 processes on a 4 core machine?

python - QImage 倾斜某些图像,但不倾斜其他图像

python - if 语句条件不适用于循环中的最后一个 i

python - WTForms-用字符串值预填充文本区域字段?

python - 定义查询模型时使用的表达式

python - 将 sklearn 的 GridSearchCV 与管道一起使用,只需预处理一次

python - 如何在 Pandas 中将与字符混合的数字转换为整数

python flask : query an item using GET