Как у меня может быть атомарный блок кода, который не имеет доступа к базе данных в Django?

#python #django #django-rest-framework #atomic

Вопрос:

Я работаю над проектом, в котором используется Django и. Django REST Framework В одном из представлений есть метод F() , который выполняет следующее:

  1. Извлекает данные из базы данных (операция чтения)
  2. Отправляет запрос на создание (публикацию) в сторонний API. (хотя это и не локально, это операция записи, и именно здесь может возникнуть условие гонки)
  3. Возвращает данные JSON

Я хотел бы F() быть атомарным, другими словами, если сервер получает несколько запросов одновременно с запросом на это представление, сервер должен обрабатывать один запрос за раз и не разрешать нескольким потокам одновременно обращаться к этому блоку кода. Как этого можно достичь? Я читал Django , что это обеспечивает, transactions.atomic() но это гарантирует атомарность транзакций базы данных, мне нужна атомарность для целого блока кода, независимо от того, обращается он к базе данных или нет.

Ответ №1:

Концепция, которую вы ищете, — это «мьютекс» или «блокировка». Эта статья может направить вас в правильном направлении https://lincolnloop.com/blog/distributed-locking-django/

Комментарии:

1. Спасибо, я посмотрю на это, но я подожду других ответов, если этого можно достичь без использования сторонних библиотек/фреймворков