正确取消pika的rabbitmq消费方式

1 投票
2 回答
2847 浏览
提问于 2025-04-17 20:48

我想用RabbitMQ实现一个RPC客户端。我的代码大致是这样的:

def start(self):
    while True:
        self.channel.basic_consume(self.on_delivery)
 ...
 client.start() // blocking call

那么,停止这个客户端的正确方法是什么呢?现在我是在另一个线程中调用 channel.basic_cancel(self.on_cancel, self.consumer_tag)。不过,pika的常见问题解答里说 在多个线程之间共享一个Pika连接是不安全的。

那么,取消消费的推荐方法是什么呢?

2 个回答

0

如果你想使用 basic_cancel,可以看看 这个链接

你可以简单地看到下面的代码:

def callback(ct, ch, method, properties, body):
   ...
   ch.basic_cancel(consumer_tag=ct, nowait=False) # WARNING no such parameter `nowait` please remove from method call
   ...

...
consumer_tag = uuid.uuid1().hex
channel.basic_consume(partial(callback, consumer_tag),
                              queue=queue_name,
                              consumer_tag=consumer_tag) # add consumer_tag
...

pika@1.3.3 版本中,没有叫 nowait 的参数,所以你只需要把它从方法调用中去掉就可以了。

2

只要你为每个线程创建一个连接,就没问题了。

eandersson在这里提供了一个例子。

撰写回答