Celery任务已在本地注册并正常运行 - 切换到EC2,Celery不会注册它们

时间:2012-07-20 21:44:43

标签: django amazon-ec2 celery

我正在运行一个带有Celery和MongoDB的Django项目作为我的经纪人,在本地工作正常。我没有使用django-celery。该项目位于../myapp/,看起来像这样:

myapp/
    <other folders>
    aws/
        tasks.py
    celeryconfig.py
    settings.py 

在这种情况下,我只是在add()中运行原型aws/tasks.py 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上的芹菜没有注册任务?

2 个答案:

答案 0 :(得分:1)

事实证明,我在EC2上的PYTHONPATH出错了。我正在处理的项目包含其中的任务/www/sites/siteA。我有另一个项目,住在/www/sites/siteB。这两个文件夹都有一个名为aws/的文件夹。

但是,我的PYTHONPATH看起来像这样:/www/sites/siteB:/www/sites/siteA

当我交换订单时,celeryd能够接收并注册任务。

答案 1 :(得分:-1)

您在本地和EC2实例上粘贴的celeryconfig.py是否完全相同?我问,因为芹菜进口线存在语法错误。对于具有一个元素的元组,需要使用尾随逗号,否则事情将不会如您所期望的那样。应该是:

CELERY_IMPORTS = ("aws.tasks",)

而不是

CELERY_IMPORTS = ("aws.tasks")