1

我正在使用 django celery(4.2),我将从我的 django 视图中添加一些任务,我也想在一个单独的进程中异步获取任务结果,但是当我尝试获取结果时,我遇到了一些错误。

我的完整步骤如下:

  1. django 芹菜配置:

项目/设置/celery.py

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Nuwa.settings.development')

app = Celery('Nuwa')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

项目/settings.py

CELERY_BROKER_URL = f'redis://{REDIS["HOST"]}:{REDIS["PORT"]}'
CELERY_RESULT_BACKEND = f'redis://{REDIS["HOST"]}:{REDIS["PORT"]}'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

项目/设置/初始化.py

from .celery import app as celery_app

__all__ = ('celery_app', )
  1. 在一个 django 视图中调用 celery 任务:
result = port_scan.delay(target)
redis_conn.sadd(celery_task_set_key, result.task_id)

在这一步中,我将 task_id 存储在 redis 集中以备将来使用。

  1. 获取任务结果
redis_conn = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
celery_tasks = redis_conn.smembers('celery-tasks')


for task_id in celery_tasks:
    print(task_id)
    celery_result = AsyncResult(task_id)
    print(celery_result.state)

当我尝试得到结果时,它有错误:

AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'

我通过搜索谷歌尝试了一些解决方案,所以它不起作用。

4

1 回答 1

0

当我们从 Celery 3.x 升级到 4.x 时,我遇到了同样的问题。尝试了各种解决方案,但最简单的就是使用set_default。因此,在 中celery.py,需要添加:

app.set_default()

这确保调用AsyncResult(task_id)将使用 Celery 应用程序的完全配置/引导版本(即使用您的 set CELERY_RESULT_BACKEND),而不是原始/默认版本(即使用DisabledBackend)。

于 2022-01-02T20:21:15.973 回答