【问题标题】:Jobtastic/Celery/RabbitMQ - AsyncResult is always PENDINGJobtastic/Celery/RabbitMQ - AsyncResult 总是 PENDING
【发布时间】:2017-07-08 02:03:04
【问题描述】:

我正在使用 Django、Celery 和 Jobtastic 来尝试设置一些我将在我的主 web 应用程序上轮询的任务。我使用 RabbitMQ 作为我的代理。

问题是,虽然启动 Celery 后任务正常显示,但尝试获取如下所示的状态:

def get_state(request, task_id):
    if request.is_ajax():
        task = AsyncResult(task_id)
        data = task.result or task.state
        print(data)
        json_data = json.dumps(data)
        return JsonResponse(json_data)

除了 PENDING 之外,我无法获得任何其他状态。我的终端显示任务已完成,但我仍然获得 PENDING 状态。我尝试将 CELERY_RESULT_BACKEND 下的后端更改为多个后端,包括 DJCelery、AMQP 和 RPC。它们在启动 Celery 时都会正确显示,所以我知道它们正在注册。我也尝试使用 --pools=solo 选项启动 Celery,正如 Windows 平台所建议的那样,但也没有任何运气。下面是我初始化 celery 应用程序的 celery.py 文件。

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'arbitrage.settings')

from django.conf import settings  # noqa

app = Celery('arbitrage')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.conf.update(
    CELERY_RESULT_BACKEND='amqp',
    BROKER_URL='amqp://'
)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

我使用以下命令实例化 Celery:

celery -A arbitrage worker -l info --pool=solo

任何帮助将不胜感激,我使用的是 Celery 3.1.5,因为 Jobtastic 无法在 Celery 版本 >4.0 上运行。

【问题讨论】:

    标签: python django rabbitmq celery


    【解决方案1】:

    最终变成了完全不相关的东西。将 task_id 传递给 AsyncResult 时它是无效的,因此我总是得到一个 Pending 状态,因为 Pending 意味着状态未知,即使是伪造的 id 值。

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 2012-11-22
      • 2019-07-18
      • 2015-09-12
      • 1970-01-01
      • 2014-09-20
      • 2013-06-13
      • 2018-05-08
      相关资源
      最近更新 更多