Как я могу иметь атомарный блок кода, который не обращается к базе данных в Django?
Я работаю над проектом, в котором используются Django
и Django REST Framework
. В одном из представлений есть метод F()
, который делает следующее:
- Fetches data from the database (read operation)
- 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)
- Returns JSON data
Я бы хотел, чтобы F()
был атомарным, другими словами, если сервер получает несколько запросов одновременно с запросом на это представление, сервер должен обрабатывать один запрос за раз и не позволять нескольким потокам одновременно обращаться к этому блоку кода. Как этого можно достичь? Я читал, что Django
обеспечивает transactions.atomic()
, но это гарантирует атомарность транзакций базы данных, а мне нужна атомарность для целого блока кода, независимо от того, обращается он к базе данных или нет.
Концепция, которую вы ищете, - это "мьютекс" или "блокировка". Эта статья может направить вас в правильном направлении https://lincolnloop.com/blog/distributed-locking-django/