我正在使用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)
我无法获得任何其他状态,但待定。我的终端显示任务已完成,但我仍然得到待处理状态。我尝试将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 -A arbitrage worker -l info --pool=solo
任何帮助将不胜感激,我使用的是芹菜 3.1.5,因为 Jobtastic 将无法与芹菜版本>4.0 一起使用。
最终成为完全无关的东西。task_id在将其传递到 AsyncResult 时无效,因此我总是得到待处理状态,因为待定意味着状态未知,即使对于虚假的 id 值也是如此。