如何在启用了多个进程的Flask应用中使用全局变量

时间:2019-12-23 07:16:09

标签: python flask multiprocessing

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

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

在这里game_dict是一些从db加载的元数据。我们需要每周刷新一次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仍然保持初始值,我想这是因为我在这里使用了processs = 3。

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

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

如果game_dict所存储的数据不多,您可以在每次请求之前访问数据库,并使用新数据重新加载game_dict变量。

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

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