我的任务进入芹菜并得到结果。我知道这一点,因为我能做到。
>>> 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 "
所以我有两个问题。
- 我在芹菜的设置中遗漏了什么导致了这个错误。我显然有结果,但BaseAsyncResult被抬高了。我甚至不知道去哪里找这个
- 忽略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..")
它在你粘贴的警告中说得很对:
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