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

我是否必须锁定蓝图实例以避免瓶子中的竞争条件?

  •  -1
  • TomSawyer  · 技术社区  · 6 年前

    使用模块范围变量或全局变量不是线程安全的。

    但其他类似蓝图的东西呢?

    我在他们的文档和Git上的许多其他代码中看到,将蓝图的实例声明为模块变量。

    http://flask.pocoo.org/docs/1.0/blueprints/

    公开可以在任何请求中更改的蓝图实例不是明智的选择。为什么他们不在某个单例或不可变的对象中声明它来防止争用条件?

    我读过这个答案。 Working with a global singleton in Flask (WSGI), do I have to worry about race conditions?

    在这种情况下,是否必须锁定蓝图实例?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Martijn Pieters    6 年前

    在处理路由时,蓝图通常不会发生变化(修改),因此不需要锁定。

    只有在处理请求时,所以 意见 是否有多个线程(每个传入请求一个线程)。这取决于为flask应用提供服务的wsgi服务器的具体情况。到那时,所有蓝图配置都已完成。

    同样,在您所链接到的问题中,视图代码不会改变 Flask 对象。它们在变异 倍数 共享价值观( a , b c )并确保这3个值被更改。 原子的 (所有这些都像一个值一样更改),需要一个锁。这并不是特定于flask或globals,这只是在使用线程时改变共享数据的工作方式。

    注:全局变量 都是一样的 作为模块范围变量。