import threading
import queue
import random
import time
# 原始数据列表
numbers = [1, 2, 3, 4, 5, 6]
# 创建与列表长度相同的队列组
queues = [queue.Queue() for _ in range(len(numbers))]
def producer():
"""生产者线程:随机从列表取数并分发到对应队列"""
while True:
num = random.choice(numbers) # 随机选择数字
idx = num - 1 # 计算对应队列索引(1→0,2→1,依此类推)
queues[idx].put(num) # 将数字放入对应队列
print(f"Produced {num} → Queue {idx}")
time.sleep(random.random() * 0.5) # 模拟处理耗时
def consumer(q_index):
"""消费者线程:持续处理指定队列中的数据"""
q = queues[q_index]
while True:
num = q.get() # 阻塞获取队列数据
print(f"[Consumer {q_index}] Processing {num} (唯一ID)")
q.task_done() # 标记任务完成
time.sleep(random.random() * 0.5) # 模拟处理耗时
if __name__ == "__main__":
# 启动3个生产者线程(可按需调整数量)
for _ in range(3):
t = threading.Thread(target=producer, daemon=True)
t.start()
# 启动与列表长度相同的消费者线程
for i in range(len(numbers)):
t = threading.Thread(target=consumer, args=(i,), daemon=True)
t.start()
# 主线程保持运行(实际生产环境需要更优雅的退出机制)
try:
while True:
time.sleep(3600)
except KeyboardInterrupt:
print("Program terminated")
代码说明:
-
队列系统:创建与原始列表长度相同的队列组,每个队列对应一个数字(索引0对应数字1,索引1对应数字2,依此类推)
-
生产者线程:
- 持续随机从原始列表中选择数字
- 根据数字值计算对应队列索引(num-1)
- 将数字放入对应队列
-
消费者线程:
- 每个消费者绑定到特定队列(通过索引)
- 持续从绑定队列获取数据
- 保证每个消费者只处理唯一对应的数字
-
运行特性:
- 使用daemon线程方便程序退出
- 包含随机延迟模拟真实处理场景
- 按Ctrl+C可优雅终止程序
执行效果:
- 多个生产者线程会持续随机选择数字并分发到对应队列
- 每个消费者线程只会处理自己对应队列中的数字
- 输出示例:
Produced 3 → Queue 2 Produced 5 → Queue 4 [Consumer 2] Processing 3 (唯一ID) [Consumer 4] Processing 5 (唯一ID) Produced 1 → Queue 0 [Consumer 0] Processing 1 (唯一ID)
扩展建议:
- 调整生产者/消费者数量观察行为变化
- 修改
time.sleep()
参数控制处理速度 - 添加队列大小限制防止内存溢出
- 使用
queue.Queue(maxsize=N)
实现流量控制
这个实现保证了每个消费者线程只会处理特定数字,同时通过队列系统实现了生产-消费的解耦,符合多线程编程的最佳实践。