我是否必须锁定Blueprint实例以避免Flask中的竞争状况?

时间:2019-04-14 12:29:18

标签: python flask thread-safety race-condition

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

但是其他诸如蓝图又如何呢?

我在他们的文档中看到git上的许多其他代码将Blueprint实例声明为模块变量

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

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

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

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

1 个答案:

答案 0 :(得分:1)

在处理路线时,通常不会更改(修改)蓝图,因此,不需要锁定。

仅在处理请求时,因此在调用 views 时,可能会有多个线程(每个传入请求一个)。这取决于用于为Flask应用程序提供服务的WSGI服务器的详细信息。到那时,所有蓝图配置已经完成。

同样,在您链接到的问题中,视图代码也没有使Flask对象发生突变。在那里,它们正在变异多个共享值(abc),并确保这3个值在原子上更改(所有值都好像一个值一起更改),则需要一个锁。这并不特定于Flask或全局变量,而只是使用线程时对共享数据进行突变的方式。

注意:全局变量与模块作用域变量相同。