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

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

  1. Fetches data from the database (read operation)
  2. Sends a create (POST) request to a 3rd party API. (although not local, this is a write operation and this is where a race condition might take place)
  3. Returns JSON data

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

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

Вернуться на верх