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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我是否必须锁定Blueprint实例以避免Flask中的竞争条件?相关的知识,希望对你有一定的参考价值。

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

但其他像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对象。在那里,他们正在改变多个共享值(abc),并确保这三个值以原子方式更改(所有值一起更改,就像一个值一样),需要锁定。这不是Flask特有的,也不是全局的,这就是使用线程时共享数据变异的方式。

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

以上是关于我是否必须锁定Blueprint实例以避免Flask中的竞争条件?的主要内容,如果未能解决你的问题,请参考以下文章

是否应该避免嵌套锁定请求?

我可以使用联锁操作来更新多个值以避免锁定关键部分/互斥锁吗?

iostream 线程安全,必须分别锁定 cout 和 cerr 吗?

Plotly.js:锁定 y 轴以避免负值

如何管理 App Engine Go 运行时上下文以避免 App Engine 锁定?

以编程方式锁定 iOS 设备上的文件