我有一个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。
或者我的设置中是否需要其他参数?
非常感谢。
答案 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的更多接口类似结构可能更有帮助。尽管如此,芹菜很棒。