2012-07-20 2 views
0

내 작업은 샐러리에 들어가서 결과를 얻습니다. 내가 이것을 할 수 있기 때문에 나는 이것을 안다.Django Celery - 누락 된 항목이 있지만 무엇이 있는지 전혀 모릅니다. 결과는 있지만 얻을 수는 없습니다

>>> ts = TaskState.objects.all()[0] 
>>> ts 
Out[31]: <TaskState: SUCCESS apps.checklist.tasks.bulk_checklist_process(ec01461b-3431-478d-adfc-6d6cf162e9ad) ts:2012-07-20 14:35:41> 
>>> ts.state 
Out[32]: u'SUCCESS' 
>>> ts.result 
Out[33]: u'{\'info\': ["Great",]}' 

그러나 나는 결과를 얻을 수있는 documented 방법을 사용하려고 할 때 - 느슨한 모든 지옥 나누기 ..

>>> from celery.result import BaseAsyncResult 
>>> result = BaseAsyncResult(ts.task_id) 
>>> result.get() 
../lib/python2.7/site-packages/djcelery/managers.py:178: TxIsolationWarning: Polling results with transaction isolation level repeatable-read within the same transaction may give outdated results. Be sure to commit the transaction for each poll iteration. 
    "Polling results with transaction isolation level " 

그래서 저는 두 가지 질문이 있습니다.

  1. 이 오류의 원인은 셀러리 설정에 무엇이 누락 되었습니까? 나는 결과를 분명히 가지고 있지만 BaseAsyncResult가 제거되었습니다. 이걸 어디에서 찾을 지조차 몰라?
  2. 초 동안 1을 무시하고는 내가 가지고있는 한 마치 ts.state == SUCCESS 일뿐입니다. ts.result으로 실행할 수 있습니다. 그 단점은 무엇이며 그 결과는 어떤 형식입니까?

업데이트

그래서 두 번째 부분은 간단합니다.

TxIsolationWarning: Polling results with transaction isolation level repeatable-read 
within the same transaction may give outdated results. Be sure to commit the transaction 
for each poll iteration. 

결과에 대한 데이터베이스를 사용하려면, 당신이 원하는 경우 동일한 프로세스에서 그들을 위해 폴링 : 그것은 당신이 붙여 경고에 너무 좋아 말한다

context['results'] = resulting_values = result.get(propagate=False) 
if not isinstance(resulting_values, dict): 
    context['results'] = resulting_values = eval(context['task'].result) 
    log.error("We should not be here..") 

답변

0

무서운하지만 쉽게 .. 그런 다음 데이터베이스의 분리 수준을 READ-COMMITTED 으로 구성하거나 결과를 확인하기 전에 트랜잭션을 커밋해야합니다. 또한 BaseAsyncResult가되지 않습니다

, 사용하십시오

from celery.result import AsyncResult 
관련 문제