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

问题描述 投票:-2回答:1

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

但其他像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实例?

python flask thread-safety race-condition
1个回答
1
投票

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

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

同样,在您链接的问题中,视图代码也不会改变Flask对象。在那里,他们正在改变多个共享值(abc),并确保这三个值以原子方式更改(所有值一起更改,就像一个值一样),需要锁定。这不是Flask特有的,也不是全局的,这就是使用线程时共享数据变异的方式。

注意:全局变量与模块范围变量相同。

© www.soinside.com 2019 - 2024. All rights reserved.