1

我正在运行一个 Django 项目,其中 Celery 和 MongoDB 作为我的代理,在本地运行良好。我没有使用django-celery. 该项目位于../myapp/其中,如下所示:

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

在这种情况下,我只是在 中运行原型add()Celery 示例aws/tasks.py,其中包含:

@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 上启动 celery 时,没有任务被列为已注册,并且上述行失败并导致错误

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 上的 celery 没有注册任务?

4

2 回答 2

1

事实证明这是我PYTHONPATH在 EC2 上的错误。我正在从事的项目中包含的任务位于/www/sites/siteA. 我有另一个项目住在/www/sites/siteB. 这两个文件夹都有一个名为aws/.

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

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

于 2012-07-24T21:36:13.807 回答
-1

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

CELERY_IMPORTS = ("aws.tasks",)

代替

CELERY_IMPORTS = ("aws.tasks")

于 2012-07-20T22:50:31.913 回答