代码之家  ›  专栏  ›  技术社区  ›  Carpetfizz

在flask应用程序中维护持久变量的最佳实践[副本]

  •  2
  • Carpetfizz  · 技术社区  · 6 年前

    我有一个flask应用程序,在该应用程序中,我在服务器启动时初始化到设备的连接。换句话说,我在调用的同一个文件中初始化这个连接 app.run . 此连接以对象的形式出现,该对象使用已建立的连接调用此设备上的函数。我希望此连接在服务器的整个生命周期内保持不变,理想情况下,我希望此对象在服务器的整个生命周期内保持不变。因为flask可能会启动多个线程来处理对服务器的请求。

    初始化这样一个对象的最佳方法是在哪里以及如何初始化

    • 完全初始化一次

    • 可在多个 Blueprint S

    也许我在找单件的?

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   davidism    6 年前

    如果您知道您的应用程序将只在具有多个线程的一个进程中运行(在大多数生产WSGi服务器中可能不是这样),一种方法是将资源与 threading.Lock 将两者封装在类中。然后通过配置将该类的一个(单个)实例“传递”到应用程序。在封装类中,保护对资源的访问。

    烧瓶的那一面可以

    @app.route('/something')
    def something():
        app.config['RESOURCE'].action(...)
        ...
    

    它调用一个方法来锁定对资源的访问并委托调用。

    def action(self, ...):
        with self.lock:
            self.resource.action(...)
    

    以这种方式锁定将阻塞可能需要同时访问资源的其他烧瓶线程。

    你可以从中学习到一个很好的例子 here . 看看 control.py ,忽略有关在单独线程中运行烧瓶的部分。

    这在dev服务器中工作正常。如果您在Uwsgi/Gunicorn下部署,所有赌注都将取消。