python 集成rabbitmq 子线程创建消费者 防止堵塞主线程
时间: 2023-07-28 20:37:07 浏览: 126
当您使用 RabbitMQ 时,主线程通常用于连接 RabbitMQ 服务器和生产者的生产消息。如果您的主线程中包含消费者,则消费者接收消息时会阻塞主线程。为了避免这种情况,您可以在主线程中创建一个新的子线程来启动消费者。
以下是一个示例代码,其中在主线程中创建了一个子线程来运行消费者:
```python
import threading
import pika
# 定义消费者函数
def consume(channel, method, properties, body):
print("Received message:", body)
# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 声明队列
channel.queue_declare(queue='test_queue')
# 在子线程中启动消费者
def start_consumer():
channel.basic_consume(queue='test_queue', on_message_callback=consume, auto_ack=True)
channel.start_consuming()
consumer_thread = threading.Thread(target=start_consumer)
consumer_thread.start()
# 在主线程中发送消息
channel.basic_publish(exchange='', routing_key='test_queue', body='Hello World!')
# 等待子线程结束
consumer_thread.join()
# 关闭连接
channel.close()
connection.close()
```
在上面的代码中,我们使用 `threading.Thread` 创建了一个新的子线程,并在其中启动了消费者。主线程发送消息后,会立即继续执行后续代码,而子线程则会在后台持续运行,等待消息到达。当子线程接收到消息时,会调用 `consume` 函数进行处理。
需要注意的是,在主线程中创建连接和通道,但在子线程中使用它们。这是因为 RabbitMQ 的连接和通道对象不是线程安全的,应该在单独的线程中使用。
阅读全文