我正在运行一个Django项目,使用Celery和MongoDB作为我的代理,该项目在本地运行良好。我没有使用django-celery
。该项目位于../myapp/
,看起来像这样:
myapp/
<other folders>
aws/
tasks.py
celeryconfig.py
settings.py
在这种情况下,我只是在aws/tasks.py
中运行典型的add()
Celery示例,它包含:
@task
def add(x, y):
return x+y
当我在命令行上运行celeryd --loglevel=INFO
时,它会很好地注册任务列表,并显示
[Tasks]
. aws.tasks.add
. (all other tasks in tasks.py)
所以现在问题来了。在Python解释器中执行以下行在我的本地机器上运行良好
>>> from aws.tasks import add
>>> result = add.delay(7,7)
>>> result.get()
14
但是,当我尝试在EC2上启动芹菜时,没有任何任务被列为已注册,上面的行失败并导致错误
Received unregistered task of type 'aws.tasks.add'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
这是我的celeryconfig.py
:
BROKER_URL = "mongodb://localhost:27017/rawDatabase"
CELERY_RESULT_BACKEND = "mongodb"
CELERY_MONGODB_BACKEND_SETTINGS = {
"host": "localhost",
"port": 27017,
"database": "rawDatabase"
}
CELERY_IMPORTS = ("aws.tasks")
我的settings.py
包含:
INSTALLED_APPS = (
...
'aws',
...
)
是的,我的PYTHONPATH
包含../myapp/
,所以应该拿起celeryconfig.py。
知道是什么原因造成的吗?为什么EC2上的芹菜没有注册任务?
原来是EC2上的PYTHONPATH
出错。我正在做的有任务的项目住在/www/sites/siteA
。我还有一个项目住在/www/sites/siteB
。两个文件夹都有一个名为aws/
的文件夹。
然而,我的PYTHONPATH
看起来是这样的:/www/sites/siteB:/www/sites/siteA
。
当我交换订单时,celeryd能够拿起并注册任务。
您在本地和EC2实例上粘贴的celeryconfig.py是否完全相同?我问是因为你们芹菜进口线上有一个语法错误。对于一个只有一个元素的元组,需要一个尾随逗号,否则就不会如您所期望的那样。应为:
CELERY_IMPORTS = ("aws.tasks",)
而不是
CELERY_IMPORTS = ("aws.tasks")