Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜Redis返回“;收到类型为“的未注册任务”;_Python_Django_Redis_Celery - Fatal编程技术网

Python 芹菜Redis返回“;收到类型为“的未注册任务”;

Python 芹菜Redis返回“;收到类型为“的未注册任务”;,python,django,redis,celery,Python,Django,Redis,Celery,我的问题是,当我尝试调用test()时,它工作得很好,但当我调用test.delay()时,它返回“received unregistered task” 启动服务。 运行test()和test.delay() 来自test.delay()的结果 设置.py BROKER_URL = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESUL

我的问题是,当我尝试调用test()时,它工作得很好,但当我调用test.delay()时,它返回“received unregistered task”

启动服务。

运行test()和test.delay()

来自test.delay()的结果

设置.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

只要重启芹菜就可以解决您的问题。这是因为当您调用
test()
时,它只是一个方法,因此不需要任何预注册

但是,当您调用
test.delay()
时,会向代理发送一条消息(任务),然后由工作进程获取该消息。此工作人员将只知道在芹菜启动之前注册的任务。这就是为什么它不会检测在启动芹菜后执行的任务

编辑


顺便说一句,我注意到的另一件事是,您似乎已将文件命名为
Tasks.py
。必须是
tasks.py
,芹菜才能在其中成功地自动发现任务。

只要重新启动芹菜就可以解决问题。这是因为当您调用
test()
时,它只是一个方法,因此不需要任何预注册

但是,当您调用
test.delay()
时,会向代理发送一条消息(任务),然后由工作进程获取该消息。此工作人员将只知道在芹菜启动之前注册的任务。这就是为什么它不会检测在启动芹菜后执行的任务

编辑


顺便说一句,我注意到的另一件事是,您似乎已将文件命名为
Tasks.py
。芹菜要在其中成功地自动发现任务,必须是
tasks.py

我通过使用DJ芹菜解决了这个问题,并卸载芹菜,因为DJ芹菜不支持芹菜4.0,而是安装了3.1.25。

我通过使用DJ芹菜解决了这个问题,并卸载芹菜,因为DJ芹菜不支持芹菜4.0并安装了3.1.25相反。

谢谢您的回复。当你说“重启芹菜”时,你的意思是重新运行芹菜--app=root。芹菜:app-worker--loglevel=INFO?如果是这样的话,我已经这么做了,但是运气不好。至于Tasks.py,它只是一种类型。谢谢你指出这一点,谢谢你的回复。当你说“重启芹菜”时,你的意思是重新运行芹菜--app=root。芹菜:app-worker--loglevel=INFO?如果是这样的话,我已经这么做了,但是运气不好。至于Tasks.py,它只是一种类型。谢谢你指出这一点。