为什么从队列中消费时需要循环调用?

问题描述 投票:0回答:1

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

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

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

basic_consume
不是以新消息准备好时“通知”的方式实现的吗?为什么开始循环调用是我的“工作”?看来轮询是违反扭曲的事件循环模式的,不是吗?

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

这是我期望它如何工作:

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

如何使用单条消息,例如

basic_get
?我是否需要开始循环调用,并在收到消息后停止它?

rabbitmq twisted pika python-pika
1个回答
1
投票

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

basic_consume 不是以新消息准备好时“通知”的方式实现的吗?为什么开始循环调用是我的“工作”?看来轮询是违反扭曲的事件循环模式的,不是吗?

Twisted 的

LoopingCall
文档指出:

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

示例代码使用

@defer.inlineCallbacks
yield
语句返回延迟函数。因此,
LoopingCall
不会重复调用该函数,它只会在延迟触发后安排新的调用。

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

这正是示例代码的工作原理。

如何使用单条消息,例如

basic_get
?我是否需要开始循环调用,并在收到消息后停止它?

如果将预取(QoS)设置为

1
,那么 RabbitMQ 将仅向消费者发送一条消息,并且在第一个消息被
basic_ack
确认之前不会发送下一条消息。

© www.soinside.com 2019 - 2024. All rights reserved.