我接近让芹菜工作与我的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
只是字符串。问题是,当芹菜工作容器启动时,这个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
的意思是一样的。所以这对我来说,你一直在使用myproj
或taskman.celery
作为你的芹菜应用程序的持有人之间徘徊。你的工作人员使用taskman.celery
,因为从测试中我发现,如果-A
或--app
的任何组合被给予单个工作调用,只有最后一个被使用。
话虽如此,我还是有一种方法可以想象你的问题会发生。如果您的myapp/tasks.py
文件从myproj.celery.app
而不是taskman.celery.app
中获得task
装饰器,那么您将使用错误的应用程序注册您的任务。