我有一个 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/