我接近让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
基本上是一个词典列表,user
和description
只是字符串。问题是,当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
的单独应用中。究竟我到底做的不正确会导致任务失误?
答案 0 :(得分:5)
在你的问题中,你用以下方式展示你的工人:
celery -A myproj worker --app=taskman.celery --loglevel=DEBUG
现在,问题在于-A
和--app
意味着同样的事情。所以这向我表明,在使用myproj
或taskman.celery
作为Celery应用程序的持有者之间,您一直在胡扯。您的工作人员使用taskman.celery
,因为通过测试,我发现如果-A
或--app
的任意组合被赋予单个工作者调用,则仅使用最后一个。
这就是说,有一种方法我可以想象你的问题正在发生。如果您的myapp/tasks.py
文件从task
而不是myproj.celery.app
获得taskman.celery.app
装饰器,那么您将使用错误的应用注册您的任务。