本文目录导读:

我来详细介绍Python操作消息队列的几种常见方式:
Redis (简单队列)
安装
pip install redis
生产者
import redis
import json
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 发送消息
def send_message(queue_name, message):
r.lpush(queue_name, json.dumps(message))
# 使用示例
send_message('my_queue', {'task': 'process_data', 'data': [1, 2, 3]})
消费者
import redis
import json
import time
r = redis.Redis(host='localhost', port=6379, db=0)
def consume_message(queue_name):
while True:
# 阻塞等待消息
message = r.brpop(queue_name, timeout=5)
if message:
_, data = message
task = json.loads(data)
print(f"处理任务: {task}")
# 处理任务...
else:
print("没有新消息,等待中...")
time.sleep(1)
consume_message('my_queue')
RabbitMQ (专业消息队列)
安装
pip install pika
生产者
import pika
# 连接RabbitMQ
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel = connection.channel()
# 声明队列
channel.queue_declare(queue='hello')
# 发送消息
channel.basic_publish(
exchange='',
routing_key='hello',
body='Hello World!'
)
print("消息已发送")
connection.close()
消费者
import pika
def callback(ch, method, properties, body):
print(f"收到消息: {body}")
# 连接
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel = connection.channel()
# 声明队列
channel.queue_declare(queue='hello')
# 消费消息
channel.basic_consume(
queue='hello',
on_message_callback=callback,
auto_ack=True
)
print('等待消息...')
channel.start_consuming()
Celery (分布式任务队列)
安装
pip install celery redis
配置文件 celery_app.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def add(x, y):
return x + y
@app.task
def process_data(data):
print(f"处理数据: {data}")
return len(data)
启动Worker
celery -A celery_app worker --loglevel=info
发送任务
from celery_app import add, process_data
# 同步调用
result = add.delay(4, 5)
print(f"结果: {result.get()}")
# 异步调用
result = process_data.delay([1, 2, 3, 4, 5])
print(f"任务ID: {result.id}")
Kafka (高吞吐量消息队列)
安装
pip install kafka-python
生产者
from kafka import KafkaProducer
import json
producer = KafkaProducer(
bootstrap_servers=['localhost:9092'],
value_serializer=lambda v: json.dumps(v).encode('utf-8')
)
# 发送消息
producer.send('my_topic', {'key': 'value', 'number': 42})
producer.flush()
print("消息已发送")
消费者
from kafka import KafkaConsumer
import json
consumer = KafkaConsumer(
'my_topic',
bootstrap_servers=['localhost:9092'],
auto_offset_reset='earliest',
value_deserializer=lambda m: json.loads(m.decode('utf-8'))
)
for message in consumer:
print(f"收到消息: {message.value}")
ZeroMQ (轻量级消息队列)
安装
pip install pyzmq
生产者
import zmq
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5555")
# 发送消息
socket.send_json({"task": "compute", "data": [1, 2, 3]})
print("消息已发送")
消费者
import zmq
context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.connect("tcp://localhost:5555")
while True:
message = socket.recv_json()
print(f"收到消息: {message}")
选择建议
| 消息队列 | 适用场景 | 特点 |
|---|---|---|
| Redis | 简单队列、缓存集成 | 简单易用,功能有限 |
| RabbitMQ | 企业级应用、复杂路由 | 成熟稳定,功能丰富 |
| Celery | 异步任务处理 | 基于RabbitMQ/Redis |
| Kafka | 大数据、日志收集 | 高吞吐量,持久化 |
| ZeroMQ | 高性能、低延迟 | 轻量级,无中间件 |
实际使用示例(使用RabbitMQ)
import pika
import json
from datetime import datetime
class MessageQueue:
def __init__(self, host='localhost'):
self.connection = pika.BlockingConnection(
pika.ConnectionParameters(host)
)
self.channel = self.connection.channel()
def declare_queue(self, queue_name):
self.channel.queue_declare(queue=queue_name, durable=True)
def publish(self, queue_name, message):
self.channel.basic_publish(
exchange='',
routing_key=queue_name,
body=json.dumps(message),
properties=pika.BasicProperties(
delivery_mode=2, # 持久化消息
)
)
def consume(self, queue_name, callback):
self.channel.basic_consume(
queue=queue_name,
on_message_callback=callback,
auto_ack=True
)
self.channel.start_consuming()
def close(self):
self.connection.close()
# 使用示例
def process_message(ch, method, properties, body):
data = json.loads(body)
print(f"[{datetime.now()}] 处理消息: {data}")
mq = MessageQueue()
mq.declare_queue('task_queue')
# 发送消息
mq.publish('task_queue', {'id': 1, 'action': 'process'})
# 消费消息(在另一个脚本中)
mq.consume('task_queue', process_message)
选择的依据:
- 简单需求:使用Redis或ZeroMQ
- 企业级应用:使用RabbitMQ
- 大数据处理:使用Kafka
- 异步任务:使用Celery
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播