芹菜+Django—KeyError未注册的任务



我接近让芹菜工作与我的Django+Docker-Compose项目,但我有一个问题,工人从来没有认识到给它的任务。基本思想是,我有一个函数insertIntoDatabase,从任务中调用:

myapp/tasks.py:

@task(name='tasks.db_ins')
def db_ins_task(datapoints, user, description):
    from utils.db.databaseinserter import insertIntoDatabase
    insertIntoDatabase(datapoints, user, description)

views.py中,我做:

from .tasks import db_ins_task
...
db_ins_task.delay(datapoints, user, description)

datapoints基本上是一个字典列表,userdescription只是字符串。问题是,当芹菜工作容器启动时,这个db_ins_task从未被发现为列出的任务之一,所以当我试图上传任何东西到我的网站时,我得到以下错误:

worker_1   | [2015-09-25 19:38:00,205: ERROR/MainProcess] Received unregistered task of type u'tasks.db_ins'.
worker_1   | The message has been ignored and discarded.
worker_1   | 
worker_1   | Did you remember to import the module containing this task?
worker_1   | Or maybe you are using relative imports?
worker_1   | Please see http://bit.ly/gLye1c for more information.
...
worker_1   | Traceback (most recent call last):
worker_1   |   File "/usr/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 455, in on_task_received
worker_1   |     strategies[name](message, body,
worker_1   | KeyError: u'tasks.db_ins'

我一直在尝试让工作器识别任务,包括将此设置添加到settings.py:

CELERY_IMPORTS = ('myapp.tasks',)

我向tasks.py添加了一些调试日志记录,以确保它不会完全被遗漏,并且我可以确认每次尝试运行任务时,日志记录器都会报告tasks.py正在运行。作为参考,以下是docker-compose.yml中的worker容器:

worker:
  build: .
  links:
    - redis
  command: bash -c "celery -A myproj worker --app=taskman.celery --loglevel=DEBUG"

celery.py在一个名为taskman的单独应用程序中。我到底做错了什么,会导致这个错误的任务?

在你的问题中,你用:

celery -A myproj worker --app=taskman.celery --loglevel=DEBUG

现在,问题是-A--app的意思是一样的。所以这对我来说,你一直在使用myprojtaskman.celery作为你的芹菜应用程序的持有人之间徘徊。你的工作人员使用taskman.celery,因为从测试中我发现,如果-A--app的任何组合被给予单个工作调用,只有最后一个被使用。

话虽如此,我还是有一种方法可以想象你的问题会发生。如果您的myapp/tasks.py文件从myproj.celery.app而不是taskman.celery.app中获得task装饰器,那么您将使用错误的应用程序注册您的任务。

最新更新