Являются ли глобальные переменные потоками безопасными в колбе?

В моем приложении состояние общего объекта изменяется, делая запросы, и ответ зависит от состояния.

class SomeObj(): def __init__(self, param): self.param = param def query(self): self.param += 1 return self.param global_obj = SomeObj(0) @app.route('/') def home(): flash(global_obj.query()) render_template('index.html') 

Если я запустил это на своем сервере разработки, я ожидаю получить 1, 2, 3 и так далее. Если запросы поступают от 100 разных клиентов одновременно, может ли что-то пойти не так? Ожидаемый результат будет состоять в том, что каждый 100 разных клиентов видят уникальный номер от 1 до 100. Или произойдет что-то подобное:

  1. Клиент 1 запрос. self.param увеличивается на 1.
  2. Прежде чем оператор return может быть выполнен, поток переключается на клиент 2. self.param снова увеличивается.
  3. Поток переключается обратно на клиент 1, и, например, клиенту возвращается номер 2.
  4. Теперь поток перемещается к клиенту 2 и возвращает ему номер 3.

Поскольку клиентов было всего два, ожидаемые результаты были 1 и 2, а не 2 и 3. Число было пропущено.

Будет ли это действительно случаться, когда я увеличиваю свое приложение? На какие альтернативы глобальной переменной я должен смотреть?

One Solution collect form web for “Являются ли глобальные переменные потоками безопасными в колбе?”

Вы не можете использовать глобальные переменные для хранения таких данных. Это не только потокобезопасность, но и безопасность процесса , а серверы WSGI в производстве порождают множество процессов. Таким образом, не только ваши ошибки будут ошибочными, если вы используете потоки для обработки запросов, они также будут меняться в зависимости от того, какой процесс обрабатывал запрос.

Сервер разработки – это одиночный поток, один процесс по умолчанию. Вы не увидите поведение, которое вы описываете, поскольку каждый запрос будет обрабатываться синхронно. Включите потоки или процессы, и вы увидите это. app.run(threaded=True) или app.run(processes=10) .

Используйте источник данных вне Flask для хранения глобальных данных. База данных, memcached или redis – все соответствующие области хранения, в зависимости от ваших потребностей. Вы также можете использовать сеанс для простых данных, предназначенных для каждого пользователя.

Python - лучший язык программирования в мире.