使用模块范围变量或全局变量不是线程安全的。
但其他像Blueprint一样的是什么?
我在他们的文档中看到,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实例?
处理路径时,蓝图通常不会发生变异(修改),因此不需要锁定。
仅在处理请求时,因此在调用视图时,可能存在多个线程(每个传入请求一个)。这取决于用于为Flask应用程序提供服务的WSGI服务器的细节。到那时,所有Blueprint配置已经完成。
同样,在您链接的问题中,视图代码也不会改变Flask
对象。在那里,他们正在改变多个共享值(a
,b
和c
),并确保这三个值以原子方式更改(所有值一起更改,就像一个值一样),需要锁定。这不是Flask特有的,也不是全局的,这就是使用线程时共享数据变异的方式。
注意:全局变量与模块范围变量相同。