Jobtastic / Celery / RabbitMQ - AsyncResult始终待命

时间:2017-07-08 02:03:05

标签: python django rabbitmq celery

我正在使用Django,Celery和Jobtastic尝试设置一些我将在我的主webapp上轮询的任务。我使用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.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。

1 个答案:

答案 0 :(得分:0)

结束了完全无关的事情。将task_id传递给AsyncResult时,task_id无效,因此我总是获得Pending状态,因为Pending意味着状态未知,即使是伪造的id值。