0

私の仕事はセロリに入り、結果を得ます。私はこれができるので、私はこれを知っています。

>>> 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 つあります。

  1. このエラーの原因となっているセロリのセットアップで何が欠けていますか。私は明らかに結果を持っていますが、 BaseAsyncResult はジャッキアップしています。私はこれをどこで探すべきかさえ知りませんか?
  2. 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..")
4

1 に答える 1

0

貼り付けた警告には、次のように書かれています。

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
于 2012-07-27T14:19:38.183 に答える