Celery:@shared_task和非标准的BROKER_URL

时间:2015-11-20 00:59:49

标签: python rabbitmq celery-task

我有一个Celery 3.1.19设置,它使用包含虚拟主机的BROKER_URL。

# in settings.py
BROKER_URL = 'amqp://guest:guest@localhost:5672/yard'

Celery正常启动,加载任务,我在@ app.task装饰器中定义的任务工作正常。我假设我的rabbitmq和芹菜配置在这一点是正确的。

任务,我使用@shared_tasks定义并使用app.autodiscover_tasks加载仍然在启动时正确加载。但是,如果我调用该任务,则消息最终会出现在(仍然存在的)amqp:// guest:guest @ localhost:5672 /虚拟主机中。

问题:我在这里缺少什么?共享任务从哪里获得实际配置。

还有更多细节

# celery_app.py

from celery import Celery

celery_app = Celery('celery_app')
celery_app.config_from_object('settings')

celery_app.autodiscover_tasks(['connectors'])

@celery_app.task
def i_do_work():
    print 'this works'

在connector / tasks.py中(同一文件夹中有__init__.py):

# in connectors/tasks.py

from celery import shared_task

@shared_task
def I_do_not_work():
    print 'bummer'

再次,共享任务也被Celery实例获取。它只是缺少将消息发送到正确的BROKER_URL的上下文。

顺便说一下。为什么shared_tasks如此纯粹地记录在案。他们依赖一些Django上下文吗?我没有使用Django。

或者我的设置中是否需要其他参数?

非常感谢。

1 个答案:

答案 0 :(得分:3)

在应用程序启动时尚未导入celery_app。在我的项目中,我将以下代码添加到与我的celery_app定义相同的模块级别的__init__.py

from __future__ import absolute_import

try:
    from .celery_app import celery_app
except ImportError:
    # just in case someone develops application without 
    # celery running    
    pass

我很惊讶Celery似乎带有一个完美的默认应用程序。在这种情况下,具有NotImplementedError的更多接口类似结构可能更有帮助。尽管如此,芹菜很棒。