2015-10-15 70 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