芹菜找不到活动任务(本地和 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.
我正在尝试在 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.