使用模块作用域变量或全局变量不是线程安全的。
但是其他诸如蓝图又如何呢?
我在他们的文档中看到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实例?
答案 0 :(得分:1)
在处理路线时,通常不会更改(修改)蓝图,因此,不需要锁定。
仅在处理请求时,因此在调用 views 时,可能会有多个线程(每个传入请求一个)。这取决于用于为Flask应用程序提供服务的WSGI服务器的详细信息。到那时,所有蓝图配置已经完成。
同样,在您链接到的问题中,视图代码也没有使Flask
对象发生突变。在那里,它们正在变异多个共享值(a
,b
和c
),并确保这3个值在原子上更改(所有值都好像一个值一起更改),则需要一个锁。这并不特定于Flask或全局变量,而只是使用线程时对共享数据进行突变的方式。
注意:全局变量与模块作用域变量相同。