据我所知,Celery 既是消息的生产者又是消费者。这不是我想要达到的。我希望 Celery 仅充当消费者,根据我发送到我选择的 AMQP 代理的消息来触发某些任务。这可能吗?
或者我需要在我的堆栈中加入胡萝卜来做汤吗?
Celery 代理充当消息存储并将它们发布给订阅这些消息的一个或多个工作人员,
所以:celery 将消息推送到代理(rabbitmq、redist、celery 本身通过 django db 等)。这些消息由工作人员按照代理的协议检索,并记住它们(通常它们是持久的,但可能取决于你的经纪人),并被你的工人执行。
任务结果在正在执行的工作任务上可用,您可以配置存储这些结果的位置,您可以使用此方法检索它们。
您可以将带有 celery 参数的任务发布到您的“接收器函数”(您定义的任务,文档中有一些示例,通常您不想在这里传递大的东西(比如查询集),而只是允许您传递的最少信息在执行任务时检索您需要的内容。
一个简单的例子可能是:
你注册一个任务
@task
def add(x,x):
return x+y
你从另一个模块调用:
from mytasks import add
metadata1 = 1
metadata2 = 2
myasyncresult = add.delay(1,2)
myasyncresult.get() == 3
编辑
在您编辑之后,我看到您可能想从芹菜以外的其他来源构建消息,您可以在此处看到消息格式,它们默认为尊重该格式的腌制对象,因此您将这些消息发布在您的 rabbitmq 代理的正确队列中你去从你的工人那里取回它们是正确的。
Celery Custom Consumer 将是 3.1v 中发布的一个功能,现在正在开发中,您可以阅读http://docs.celeryproject.org/en/master/userguide/extending.html了解它。