私の仕事はセロリに入り、結果を得ます。私はこれができるので、私はこれを知っています。
>>> 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 "
そこで、質問が 2 つあります。
- このエラーの原因となっているセロリのセットアップで何が欠けていますか。私は明らかに結果を持っていますが、 BaseAsyncResult はジャッキアップしています。私はこれをどこで探すべきかさえ知りませんか?
- 1 秒間無視
ts.state == SUCCESS
すると、ts.result
. その欠点は何ですか?また、その結果はどのような形式になりますか?
アップデート
したがって、2番目の部分は簡単です。 怖いけど簡単..
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..")