芹菜找不到活动任务(本地和 Heroku)

celery cannot find active tasks (locally and on Heroku)

我正在尝试在 Heroku 上部署一个应用程序,我正在使用 Celery 和 Redis 来管理后台任务。我目前有一个后台任务,通过 FTP 收集数据并将其放入数据库中。我还有一个加载页面,该页面会定期刷新直到任务完成。但是,我无法检索活动任务列表(从 celery.task.control returns None 检查)。我在本地尝试了 运行 这个,我可以看到 Celery 收到了任务(在终端中)。我还可以看到 Celery 在启动期间在正确的端口连接到 Redis。

我尝试重新安装几个库,并确保 settings.py 文件中的所有变量都已正确设置。我也尝试检查 os.environ['REDIS_URL'] 的值,它是正确的。

相关代码来自settings.py

CACHES = {
    "default": {
         "BACKEND": "redis_cache.RedisCache",
         "LOCATION": os.environ['REDIS_URL'],
    }
}


CELERY_BROKER_URL = os.environ['REDIS_URL']
CELERY_RESULT_BACKEND = os.environ['REDIS_URL']
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

celery.py:

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

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'genome.settings')
os.environ.setdefault('REDIS_URL', 'redis://localhost:6379/0')
app = Celery('genome_app')

app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
                CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])

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

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

(在应用程序的 views.py 中)

来自celery.task.control 导入检查

...

i = inspect()
active_tasks = list(i.active().values())[0]

AttributeError: 'NoneType' 对象没有属性 'values'

我已经有一段时间遇到同样的问题了。开发人员似乎意识到了这一点 (https://github.com/celery/kombu/issues/1081)。我发现通过尝试强制它安装旧版本的 kombu(4.5.0 现在似乎对我有用)它暂时又可以工作了。

from celery.task.control import inspect
i = inspect()
dictfile = i.active()

details={}
properties=[]

if you want to get the args,taskid as new dict

for dictele in dictfile:
    for dictloop in dictfile[dictele]:
        jobid=dictloop['args']
        taskid= dictloop['id']
        jobid=jobid.replace("('","")
        jobid=jobid.replace("',)",'')
        details["jobid"]=jobid
        details["taskid"]=taskid
        properties.append(details)
print(properties)

You can create your own task manager list by using above details.