2015-10-15 52 views
0

我有一個django視圖,它通過API POST請求將對象ID添加到隊列中。然後,我有一個芹菜任務,使id出列並做一些處理。有時,芹菜任務會拋出一個錯誤,指出該對象不存在。我在視圖中添加了5秒的延遲,並且我再也看不到這個錯誤了。django orm是否立即創建對象

View: 
def create(self, request): 
    user = request.user 
    serializer = UnpredictedSentenceSerializer(data=request.data) 
    if serializer.is_valid(): 
     saved_raw_text = UnpredictedSentence.objects.create(
            raw_text=serializer.data['raw_text'], 
            user=user) 
     prediction.apply_async(
      args=[saved_raw_text.pk], 
      countdown=5 
     ) 
     print(saved_raw_text.pk) 
     return Response(status=status.HTTP_200_OK) 
    else: 
     return Response(
        serializer.errors, status=status.HTTP_400_BAD_REQUEST) 


Task: 
@task() 
def prediction(id): 
    print(id) 
    print(type(id)) 
    UnpredictedSentence.objects.get(pk=id) 
    try: 
     un_sent = UnpredictedSentence.objects.get(pk=id) 
    except UnpredictedSentence.DoesNotExist: 
     un_sent = None 
    if un_sent: 
     print(type(un_sent.raw_text)) 
     text = json.loads(un_sent.raw_text) 
     results = kudos.main(text['raw_text']) 
     PredictedSentence.objects.create(
     cleaned_text=results['cleaned_text'], 
     raw_text=results['raw_text'], 
     sentiment=results['sentiment'], 
     user=un_sent.user) 
     print(results) 

回答

2

幾乎肯定是交易問題。由於事務隔離,其他進程將不會看到在事務提交之前創建的對象,這些事件發生在請求結束時。五秒鐘的延遲爲此發生了足夠的時間。

+0

只是一個一般的評論,另外,使用睡眠來解決競爭條件幾乎總是一個壞主意。芹菜任務可以檢查它是否存在,如果不存在,請將它放在隊列中供其他工人使用? – FlipperPA