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