Celery + Django - KeyError未注册的任务

时间:2015-09-25 19:54:10

标签: python django celery docker-compose

我接近让Celery使用我的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只是字符串。问题是,当Celery工作容器启动时,此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是正在运行。作为参考,这是worker中的docker-compose.yml容器:

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

celery.py位于名为taskman的单独应用中。究竟我到底做的不正确会导致任务失误?

1 个答案:

答案 0 :(得分:5)

在你的问题中,你用以下方式展示你的工人:

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

现在,问题在于-A--app意味着同样的事情。所以这向我表明,在使用myprojtaskman.celery作为Celery应用程序的持有者之间,您一直在胡扯。您的工作人员使用taskman.celery,因为通过测试,我发现如果-A--app的任意组合被赋予单个工作者调用,则仅使用最后一个。

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