为什么从队列使用时需要循环调用?



我正在尝试使用pika和扭曲从兔子队列中消费:

  1. 不断(新消息 ->消耗)
  2. 一次(新消息 ->消耗一次,在我说之前不要再消耗)

我唯一的输入是这个例子。它涵盖了用例 1。用例 2 呢?

basic_consume不是以在新消息准备就绪时"通知"的方式实现的吗?为什么启动循环调用是我的"工作"?似乎轮询是针对扭曲的事件循环模式,不是吗?

当使用 twisted 发出 http 请求时,它会发送请求并在返回后继续执行(通过延迟)。为什么这在RabbitMQ/pika中不起作用?

以下是我希望它的工作方式:

  1. 订阅队列
  2. 从队列中消耗(除非队列中有消息,否则不会立即触发,每次队列中有新消息时都会触发,我现在忽略qos

如何使用单个消息,例如basic_get?我是否需要启动循环呼叫,并在收到消息后停止它?

RabbitMQ 团队监控rabbitmq-users邮件列表,并且只偶尔回答 StackOverflow 上的问题。


你问了几个问题,所以我会尽力回答。我是 Pika 的维护者之一,但不像其他连接适配器那样熟悉 Twisted。

basic_consume不是以在新消息准备就绪时"通知"的方式实现的吗?为什么启动循环调用是我的"工作"?似乎轮询是针对扭曲的事件循环模式,不是吗?

Twisted的LoopingCall文档指出:

重复调用函数。如果 f 返回延迟,则在触发延迟之前不会进行重新调度。

示例代码使用@defer.inlineCallbacksyield语句返回延迟函数。因此,LoopingCall不会重复调用该函数,它只会在延迟触发后安排新调用。

这是我期望它的工作方式...从队列中消耗(除非队列中有消息,否则不会立即触发,每次队列中有新消息时都会触发,我现在忽略 qos。

这正是示例代码的工作方式。

如何使用单个消息,例如basic_get?我是否需要启动循环呼叫,并在收到消息后停止它?

如果将预取 (QoS) 设置为1,则 RabbitMQ 将只向消费者发送一条消息,并且在basic_ack确认第一条消息之前不会发送下一条消息。

相关内容

  • 没有找到相关文章

最新更新