Глобальная переменная колбы теряется через несколько секунд [дубликат]

Это что-то еще:

div.inline { float:left; }
.clearBoth { clear:both; }
<div class="inline">1<br />2<br />3</div>
<div class="inline">1<br />2<br />3</div>
<div class="inline">1<br />2<br />3</div>
<br class="clearBoth" /><!-- you may or may not need this -->

30
задан davidism 1 June 2018 в 16:38
поделиться

1 ответ

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

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


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


Некоторые серверы WSGI могут поддерживать gevent или другого асинхронного рабочего. Глобальные переменные по-прежнему не являются потокобезопасными, поскольку по-прежнему нет защиты от большинства условий гонки. У вас все еще может быть сценарий, когда один работник получает значение, дает, другой его модифицирует, дает, то первый работник также модифицирует его.

29
ответ дан davidism 16 August 2018 в 10:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: