Нужно ли блокировать экземпляр Blueprint, чтобы избежать гонки в Flask? - PullRequest
0 голосов
/ 14 апреля 2019

Использование переменных области модуля или глобальной переменной не поточно-ориентировано.

Но как насчет других, таких как Blueprint?

Я вижу в их документе и во многих других кодах на git экземпляр Blueprint объявлен как переменная модуля

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

Предоставление экземпляра чертежа, который можно изменить в любом запросе, не является разумным выбором. Почему они не объявляют это в каком-то одноэлементном или неизменном объекте, чтобы предотвратить состояние расы?

Я прочитал этот ответ. Работая с глобальным синглтоном во Flask (WSGI), нужно ли мне беспокоиться о состоянии гонки?

Нужно ли блокировать экземпляр Blueprint в этом случае?

1 Ответ

1 голос
/ 14 апреля 2019

Чертежи обычно не видоизменяются (не изменяются) при обработке маршрутов, поэтому нет, блокировка не требуется.

Только при обработке запросов, поэтому при вызове views может быть несколькотемы (по одному на входящий запрос).Это зависит от специфики сервера WSGI, используемого для обслуживания вашего приложения Flask.К этому времени вся конфигурация Blueprint уже завершена.

В том же духе, в вопросе, на который вы ссылаетесь, код представления также не изменяет объект Flask.Там они мутируют несколько общих значений (a, b и c), и для обеспечения того, чтобы эти 3 значения были изменены атомно (все изменились вместе, как будто одинзначение), блокировка необходима.Это не относится только к Flask или к глобальным переменным, это только то, как работает изменение общих данных при использовании потоков.

Примечание: глобальные переменные - это то же самое, что и 1018 *, что и переменные области модуля.

...