皮卡示例 https://github.com/pika/pika/blob/main/examples/basic_consumer_threaded.py

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

我读过这个小组的一些帖子,但我不明白使用的意义是什么: https://github.com/pika/pika/blob/main/examples/basic_consumer_threaded.py

我的意思是,为什么我们需要一个额外的线程来处理消息并调用 add_callback_threadsafe 作为参数,我们传递 ack 方法(这两个活动都在同一个新线程中进行处理)。 我想知道我们如何防止在消费消息时从通道关闭连接,因为如果处理时间长于心跳值,我们会在之后发送 ack,这对我来说就像在主线程中消费然后发送 ack 一样。 如果我们在单独的一个线程中运行处理和发送 ack 有什么区别?

我是Python和鼠兔的新手,如果这个问题很奇怪,很抱歉

我不明白,我想要解释

python rabbitmq pika
1个回答
0
投票

如果处理时间长于心跳值,我们会在之后发送 ack,这对我来说是同样的情况,就像在主线程中消费然后发送 ack

不,那不是真的。如果您在主线程中消耗,则在发送 ack BLOCKS Pika 的 I/O 循环之前处理消息所需的时间,因为 Pika 的 I/O 循环在创建连接的任何线程(即主线程)上运行。这就是为什么你应该在单独的线程上工作。

以下是一些示例代码的逐行解释:https://groups.google.com/g/rabbitmq-users/c/grHdO0s6Owo/m/F6ULK0G0BgAJ

我最近回答了很多“Pika 如何与线程一起工作”的问题,它们全部都归结为对线程、Pika 及其 I/O 循环的误解。 Pika 不会为 I/O 启动单独的线程。如果您在创建 Pika 连接的线程中工作,您将阻塞 I/O 循环。

请注意,一般来说,任何执行 I/O 的程序或库都是在循环中执行的,这将阻塞创建循环的任何线程。有些库为此创建了一个专用线程并向用户“隐藏”它,但 Pika 不会。

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