据我所知,Celery既是消息的制作者又是消费者。这不是我想要达到的目标。我希望Celery仅作为消费者,根据我发送给我选择的AMQP代理的消息来激活某些任务。这可能吗?
或者我需要在堆叠中添加胡萝卜来制作汤?
答案 0 :(得分:6)
芹菜经纪人充当消息存储并将其发布给订阅这些消息的一个或多个工作者,
所以:celery将消息发送给经纪人(rabbitmq,redist,celery本身通过django db等等)。这些消息由工作人员按照经纪人的协议检索,记住他们(通常他们是持久的但也许它依赖于你的经纪人),并由你的工人执行。
任务结果可在执行的工作人员任务中使用,您可以配置store those results的位置,然后使用this method检索它们。
你可以将芹菜传递参数的任务发布到你的“接收函数”(你定义的任务,文档有一些examples,通常你不想在这里传递大的东西(比如查询集),但是只有允许您在执行任务时检索所需内容的最小信息。
一个简单的例子可能是:
您注册任务
@task
def add(x,x):
return x+y
然后用另一个模块调用:
from mytasks import add
metadata1 = 1
metadata2 = 2
myasyncresult = add.delay(1,2)
myasyncresult.get() == 3
修改强>
在编辑之后我看到你可能想要从芹菜以外的其他来源构建消息,你可以看到here消息格式,它们默认为尊重该格式的pickle对象,所以你发布这些消息你的rabbitmq经纪人的正确队列,你是正确的从你的工人那里检索它们。答案 1 :(得分:1)
Celery使用message broker architectural pattern。 Celery可以使用许多实现/代理传输,包括RabbitMQ和Django database。
来自Wikipedia:
消息代理是用于消息验证,消息转换和消息路由的架构模式。它调解应用程序之间的通信,最大限度地减少应用程序之间应该具有的相互意识,以便能够交换消息,有效地实现解耦。
保持结果是可选的,需要结果后端。您可以使用不同的代理和结果后端。 Celery Getting Started指南包含更多信息。
您的问题的答案是是您可以触发传递参数的特定任务,而无需添加Carrot。
答案 2 :(得分:1)
Celery Custom Consumer将是3.1v发布的功能,现在正在开发中,您可以阅读http://docs.celeryproject.org/en/master/userguide/extending.html。