我正在做一个使用Django
和Django REST Framework
的项目。在其中一个视图中,有一个方法F()
,它执行以下操作:
- 从数据库中读取数据(读取操作)
- 向第三方API发送创建(POST)请求。(虽然不是本地操作,但这是一个写操作,这是可能发生竞争条件的地方) 返回JSON数据
我希望F()
是原子的,换句话说,如果服务器同时收到请求此视图的多个请求,服务器应该一次处理一个请求,并且不允许多个线程同时访问此代码块。如何才能做到这一点?我读到Django
提供了transactions.atomic()
,但这保证了数据库事务的原子性,我需要的是整个代码块的原子性,无论它是否访问数据库。
您正在寻找的概念是"互斥";或者一个"锁"。这篇文章可能会指引您正确的方向https://lincolnloop.com/blog/distributed-locking-django/