Джанго Сельери - Что-то пропустил, но я понятия не имею, что? Есть результаты, но не могу их получить

Моя задача уходит в сельдерей и дает результаты. Я знаю это, потому что я могу это сделать.

>>> 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",]}'

Но когда я пытаюсь использовать документированный способ, чтобы получить результат - весь ад проваливается..

>>> 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, Каков был бы недостаток этого и в каком формате этот результат?

Обновить

Так что вторая часть проста. Страшно, но легко..

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..")

1 ответ

Так сказано прямо в предупреждении, которое вы вставили:

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.

Чтобы использовать базу данных для результатов, и если вы хотите опросить их в одном и том же процессе, вам нужно либо настроить уровень изоляции базы данных, чтобы READ-COMMITTEDили совершите транзакцию, прежде чем проверять результат.

Также BaseAsyncResult устарела, пожалуйста, используйте

from celery.result import AsyncResult
Другие вопросы по тегам