芹菜和定制消费者

2024-05-16 12:07:24 发布

您现在位置:Python中文网/ 问答频道 /正文

据我所知,芹菜是信息的生产者和消费者。这不是我想要的。我只想让芹菜充当消费者,根据我发送给我选择的AMQP经纪人的消息触发某些任务。这可能吗?

或者我需要把胡萝卜加到汤里做汤吗?


Tags: 信息消息amqp经纪人消费者芹菜发送给生产者
3条回答

芹菜使用message broker architectural pattern。许多实现/代理传输可以与芹菜一起使用,包括RabbitMQDjango database

来自Wikipedia

A message broker is an architectural pattern for message validation, message transformation and message routing. It mediates communication amongst applications, minimizing the mutual awareness that applications should have of each other in order to be able to exchange messages, effectively implementing decoupling.

保留结果是可选的,需要一个结果后端。您可以使用不同的代理和结果后端。Celery Getting Started指南包含更多信息。

您的问题的答案是您可以启动特定的任务,传递参数而不将Carrot添加到组合中。

芹菜定制消费者将是3.1v中发布的一个功能,现在正在开发中,您可以阅读http://docs.celeryproject.org/en/master/userguide/extending.html关于它的内容。

芹菜经纪人充当一个信息存储库,并将其发布给订阅这些信息的一个或多个员工

所以:芹菜会将消息发送给代理(rabbitmq、redist、芹菜本身通过django db等等),这些消息由一个工人按照代理的协议检索,该协议会记住它们(通常它们是持久的,但可能依赖于您的代理),并由您的工人执行。

任务结果在正在执行的工作任务上可用,您可以配置到store those results的位置,并可以使用this method检索它们。

您可以发布带有芹菜的任务,将参数传递给您的“receiver函数”(您定义的任务,文档中有一些examples,通常您不想在这里传递大的东西(比如queryset),而只需要允许您在执行任务时检索所需内容的最小信息。

一个简单的例子是:

你注册了一个任务

@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消息格式,它们默认为与该格式相关的pickled对象,因此您将这些消息发布到rabbitmq代理的正确队列中,并且您可以从您的工作人员检索它们。

相关问题 更多 >