gpt4 book ai didi

python - 如何在不依赖其他软件的情况下为我的 Flask 应用程序与多个工作人员提供共享状态?

转载 作者:行者123 更新时间:2023-12-03 13:44:32 25 4
gpt4 key购买 nike

我想为与多个工作人员一起运行的 Flask 应用程序提供共享状态,即。 e.多个进程。

报价 this answer来自关于此主题的类似问题:

You can't use global variables to hold this sort of data. [...] Use a data source outside of Flask to hold global data. A database, memcached, or redis are all appropriate separate storage areas, depending on your needs.



(来源: Are global variables thread safe in flask? How do I share data between requests?)

我的问题是关于如何在 Flask“外部”提供数据的建议的最后一部分。目前,我的网络应用程序非常小,我想避免对其他程序的要求或依赖。如果我不想在后台运行 Redis 或其他任何东西,而是为所有内容提供 Web 应用程序的 Python 代码,我有什么选择?

最佳答案

如果您的网络服务器的工作器类型与 multiprocessing 兼容模块,您可以使用 multiprocessing.managers.BaseManager 为 Python 对象提供共享状态。一个简单的包装器可能如下所示:

from multiprocessing import Lock
from multiprocessing.managers import AcquirerProxy, BaseManager, DictProxy

def get_shared_state(host, port, key):
shared_dict = {}
shared_lock = Lock()
manager = BaseManager((host, port), key)
manager.register("get_dict", lambda: shared_dict, DictProxy)
manager.register("get_lock", lambda: shared_lock, AcquirerProxy)
try:
manager.get_server()
manager.start()
except OSError: # Address already in use
manager.connect()
return manager.get_dict(), manager.get_lock()
您可以将数据分配给 shared_dict使其可跨进程访问:
HOST = "127.0.0.1"
PORT = 35791
KEY = b"secret"
shared_dict, shared_lock = get_shared_state(HOST, PORT, KEY)

shared_dict["number"] = 0
shared_dict["text"] = "Hello World"
shared_dict["array"] = numpy.array([1, 2, 3])
但是,您应该注意以下情况:
  • 使用shared_lock在覆盖 shared_dict 中的值时防止出现竞争条件. (参见下面的 Flask 示例。)
  • 没有数据持久性。如果您重新启动应用程序,或者如果主(第一个)BaseManager进程死亡,共享状态消失。
  • 通过 BaseManager 的这个简单实现,您不能直接编辑 shared_dict 中的嵌套值.例如,shared_dict["array"][1] = 0没有效果。您必须编辑副本,然后将其重新分配给字典键。

  • flask 示例:
    以下 Flask 应用程序使用全局变量来存储计数器编号:
    from flask import Flask
    app = Flask(__name__)

    number = 0

    @app.route("/")
    def counter():
    global number
    number += 1
    return str(number)
    这适用于仅使用 1 个工作人员 gunicorn -w 1 server:app .使用多个 worker 时 gunicorn -w 4 server:app很明显 number不是共享状态,而是每个工作进程的个体。
    相反,使用 shared_dict ,应用程序如下所示:
    from flask import Flask
    app = Flask(__name__)

    HOST = "127.0.0.1"
    PORT = 35791
    KEY = b"secret"
    shared_dict, shared_lock = get_shared_state(HOST, PORT, KEY)

    shared_dict["number"] = 0

    @app.route("/")
    def counter():
    with shared_lock:
    shared_dict["number"] += 1
    return str(shared_dict["number"])
    这适用于任意数量的 worker ,例如 gunicorn -w 4 server:app .

    关于python - 如何在不依赖其他软件的情况下为我的 Flask 应用程序与多个工作人员提供共享状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734298/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com