【问题标题】:Django Celery - Missing something but I have no idea what? Have results but can't get themDjango Celery - 缺少一些东西,但我不知道是什么?有结果但得不到
【发布时间】:2012-07-20 05:09:14
【问题描述】:

我的任务进入芹菜并取得成果。我知道这一点,因为我能做到。

>>> 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. 我的 celery 设置中缺少什么导致此错误。我显然有结果,但 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..")

【问题讨论】:

    标签: django rabbitmq celery django-celery


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2021-08-04
      • 2023-02-25
      • 1970-01-01
      相关资源
      最近更新 更多