Условия состязания в django

Не уверен, почему, но репозиторий EPEL установлен, но по умолчанию отключен. Вы можете включить его навсегда, изменив настройку "enabled=1" в [epel] stanza of /etc/yum.repos.d/epel.repo

Или вы можете оставить его отключенным и по-прежнему устанавливать byobu:

sudo yum install --enablerepo=epel byobu

Вы можете иметь Посмотрите, какие пакеты доступны в репозитории epel:

sudo yum list --disablerepo=\* --enablerepo=epel
35
задан RichVel 15 March 2014 в 11:04
поделиться

4 ответа

У вас есть много способов однопотоковой работы такого рода.

Один из стандартных подходов - Сначала обновить . Вы выполняете обновление, которое захватывает исключительную блокировку строки; тогда делай свою работу; и, наконец, зафиксируйте изменение. Чтобы это сработало, вам нужно обойти кеширование ORM.

Другой стандартный подход - иметь отдельный однопоточный сервер приложений, который изолирует веб-транзакции от сложных вычислений.

  • Ваше веб-приложение может создать очередь запросов на оценку, порождать отдельный процесс и затем записывать запросы оценки в эту очередь. Порождение можно поместить в urls.py Django, чтобы это происходило при запуске веб-приложения. Или его можно поместить в отдельный скрипт администратора manage.py . Или это можно сделать "по мере необходимости" при попытке первого запроса оценки.

  • Вы также можете создать отдельный веб-сервер с WSGI, используя Werkzeug, который принимает запросы WS через urllib2. Если у вас есть один номер порта для этого сервера, запросы ставятся в очередь по TCP / IP. Если ваш обработчик WSGI имеет один поток, значит, вы получили сериализованную однопоточную обработку. Это немного более масштабируемо, поскольку механизм оценки является запросом WS и может выполняться где угодно.

Еще один подход состоит в том, чтобы иметь какой-то другой ресурс, который должен быть получен и удерживаться для выполнения вычислений.

  • Объект Singleton в базе данных. Отдельная строка в уникальной таблице может быть обновлена ​​с помощью идентификатора сеанса, чтобы получить контроль; обновить с идентификатором сеанса Нет , чтобы освободить управление. Существенное обновление должно включать фильтр WHERE SESSION_ID IS NONE , чтобы гарантировать, что обновление не удастся, когда блокировка удерживается кем-то другим. Это интересно, потому что оно изначально не содержит гонок - это единичное обновление, а не последовательность SELECT-UPDATE.

  • Семафор разнообразного вида может использоваться вне базы данных. С очередями (как правило) легче работать, чем с семафором низкого уровня.

6
ответ дан 27 November 2019 в 06:49
поделиться

Возможно, это слишком упрощает вашу ситуацию, но как насчет простой замены ссылки JavaScript? Другими словами, когда пользователь нажимает ссылку или кнопку, оберните запрос в функцию JavaScript, которая немедленно отключает / "затеняет" ссылку и заменяет текст информацией "Загрузка ..." или "Отправка запроса ..." или что-то еще. аналогичный. Подойдет ли это вам?

1
ответ дан 27 November 2019 в 06:49
поделиться

Здесь можно использовать блокировку базы данных. Планируется добавить поддержку «выбора для обновления» в Django ( здесь ), но на данный момент проще всего было бы использовать необработанный SQL для ОБНОВЛЕНИЯ пользовательского объекта, прежде чем вы начнете вычислять оценку.


Пессимистическая блокировка теперь поддерживается ORM Django 1.4, если базовая БД (например, Postgres) поддерживает ее. См. Примечания к выпуску Django 1.4a1 .

8
ответ дан 27 November 2019 в 06:49
поделиться

Начиная с Django 1.1, вы можете использовать выражения F () ORM для решения этой конкретной проблемы.

from django.db.models import F

user = request.user
user.points  = F('points') + calculate_points(user)
user.save()

Подробнее см. Документацию:

https://docs.djangoproject.com/en/1.8/ref/models/instances/#updating-attributes-based-on-existing-fields

https: //docs.djangoproject.com/en/1.8/ref/models/expressions/#django.db.models.F

19
ответ дан 27 November 2019 в 06:49
поделиться
Другие вопросы по тегам:

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