2011-01-23 3 views
1

중요하지는 않지만 이는 this question의 후속 조치입니다.Django Celery를 사용하여 개체에보기 카운터 추가

내 데이터베이스의 각 개체를 본 횟수를 계산하고 싶습니다. 여러 인스턴스와 함께 Person 모델이 있다고 가정 해 보겠습니다. Django Celery를 사용하여 데이터베이스 쓰기를 기다리는 것을 피하기 위해 Person 모델에서 각 인스턴스를 몇 번 보았는지 카운터를 유지하려고합니다. 순간

나는이 일을 해요 : 다음

from celery.decorators import task 

class Person(models.Model): 
    name = models.CharField(max_length=50) 


class Stats(models.Model): 
    person = models.ForeignKey('Person', unique=True) 
    @task 
    def addView(self): 
     se = StatEvent() 
     se.save() 
     self.views.add(se) 

class StatEvent(models.Model): 
    date = models.DateTimeField(auto_now_add=True) 

, 사람의 페이지를 나열 뷰를 호출 할 때마다, 나는 모든 사람을 얻을,이 같은 통계를 업데이트 :

person.get_stats().addView.delay(person.get_stats()) 

그런 다음 브라우저에 표시 할 사람 목록을 반환합니다. 나는 통계의 업데이트가 비동기식으로 일어날 것이라고 생각했지만 셀로리 명령 창에 추가 할 때마다 print 문을 표시함으로써 페이지가 표시되기 전에 명확하고 긴 지연이있었습니다. 페이지는 마지막 통계가 업데이트 된 후에 만 ​​렌더링됩니다.

사용자가 데이터베이스 업데이트가 완료 될 때까지 기다리지 않는 방법은 무엇입니까? 업데이트

나는이 개별적으로 각 사람을 처리하는 데 충분한 작업자 프로세스가없는 함께 할 수있는 뭔가가있을 수 있습니다 생각, 그래서 내가 대신 매개 변수로 사람들의 목록을 허용하는 함수를 만들고, 이것을 사용 실행될 작업으로 그래서, 큐에 하나의 작업 :

@task(ignore_result=True) 
def addViews(persons): 
    for person in persons: 
     stats = listing.get_stats() 
     se = StatEvent() 
     se.save() 
     stats.views.add(se) 

그러나, 콘솔, 같은 인쇄 :

print "adding" 
    print tasks.addClicks(persons) 
    print "done" 

그런 다음 "추가"및 "완료"단계 사이에 명확한 지연이있다, 함수의 리턴 값은 None입니다.

답변

1

거기에 대한 원래의 의구심이 옳았다는 사실이 밝혀졌습니다. 모든 것을 하나의 작업에 넣은 새로운 기능으로 문제가 해결되었습니다. tasks.addClicks(persons) 호출에서 .delay이 누락되었습니다.