python diango 并发_python - django Model 并发写数据出现重复值
問(wèn) 題
view視圖代碼:
@login_required
def data(request, page, keyword,strEncode):
current_username = request.user
data_s = dosomething() #花費(fèi)比較長(zhǎng)的時(shí)間
if not UserRecord.objects.filter(user=User.objects.get(username=current_username),MyRecords=keyword):
UserRecord.objects.create(user=User.objects.get(username=current_username),MyRecords=keyword)
return JsonResponse(data_s, safe=False)
模型代碼:
class UserRecord(models.Model):
user = models.ForeignKey(User)
MyRecords = models.CharField(max_length=128)
def __unicode__(self):
return self.user.username
現(xiàn)在我重復(fù)請(qǐng)求(快速,無(wú)間隔)5次http://127.0.0.1:8000/1/test/...(類似多線程并發(fā)),由于視圖里面的dosomething函數(shù)會(huì)消耗比較長(zhǎng)的時(shí)間,5個(gè)請(qǐng)求會(huì)并發(fā)進(jìn)行,由于是并發(fā),數(shù)據(jù)庫(kù)中會(huì)記錄5個(gè)test值,本意只想記錄一個(gè),怎么解決這個(gè)問(wèn)題?django有沒(méi)有像線程鎖一樣的東西,或者臨界區(qū)類似的?lock.acquire(),lock.release()?
解決方案
django默認(rèn)沒(méi)有提供鎖,你可以使用其他服務(wù)提供的鎖服務(wù),比如數(shù)據(jù)庫(kù)的。
不過(guò)看你的需求可以有更簡(jiǎn)單的做法:
設(shè)置MyRecords字段為unique
MyRecords = models.CharField(max_length=128, unique=True)
在create record時(shí)catch InterityError異常
from django.db import IntegrityError
try:
UserRecord.objects.create(
user=User.objects.get(username=current_username), MyRecords=keyword
)
except IntegrityError:
pass
掃一掃關(guān)注IT屋
微信公眾號(hào)搜索 “ IT屋 ” ,選擇關(guān)注與百萬(wàn)開(kāi)發(fā)者在一起
總結(jié)
以上是生活随笔為你收集整理的python diango 并发_python - django Model 并发写数据出现重复值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: seo专题之开篇有益
- 下一篇: ipython和python怎么用_如何