2016-12-01 67 views
1

我的问题是,当我尝试调用test()时,它工作得很好,但是当我调用test.delay()时,它返回“received unregistered task”。芹菜Redis返回“接收未注册的任务类型”

开始服务。 enter image description here

运行试验(+)和test.delay()(你可以看到,第一个作品。)从test.delay enter image description here

结果()

enter image description here

Settings.py

BROKER_URL = 'redis://localhost:6379/0' 
CELERY_ACCEPT_CONTENT = ['json'] 
CELERY_TASK_SERIALIZER = 'json' 
CELERY_RESULT_SERIALIZER = 'json' 
CELERY_IMPORTS=("tasks") 

INSTALLED_APPS = (
    "systech_account", 
    #... 
) 

tasks.py

from __future__ import absolute_import 

from celery import shared_task 

@shared_task 
def test(): 
    return "Just a Test" 

celeryconfig.py

from __future__ import absolute_import 

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

# set the default Django settings module for the 'celery' program. 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'root.settings') 

app = Celery() 
# 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.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


我使用

  • 的Django 1.9
  • 芹菜4.0
  • Redis的服务器2.8.4
  • 的Python 2.7
  • 的Ubuntu 14.04

回答

0

只是restarti ng芹菜应该解决你的问题。这是因为当你拨打test()时,这只是一种方法,所以它不需要任何预先注册。

但是,如果您致电test.delay(),则会向代理发送消息(任务),然后由工作人员提取消息(任务)。这名工人只会知道Celery开始之前注册的任务。这就是为什么它不会检测启动Celery后执行的任务。

编辑

顺便说一句,我注意到另一件事是,你似乎已经命名自己的文件为Tasks.py。它必须tasks.py,而不是让Celery在其中成功自动发现任务。

+0

感谢您的回复。当你说“重启Celery”时,你的意思是重新运行* celery --app = root.celery:app worker --loglevel = INFO *?如果是这样,我已经做到了,但没有运气。至于Tasks.py,它只是一种类型。感谢您指出了这一点。 – aldesabido

0

我解决了它通过使用djcelery和卸载芹菜,因为djcelery不支持芹菜4.0和安装3.1.25代替。