Python基础(①⑧Queue)
Python 标准库提供了两种常用的队列工具:
queue.Queue:用于多线程间的安全通信(线程安全)
collections.deque:更轻量的队列实现,适合单线程场景
1. 单线程场景:用 collections.deque 实现队列
deque
(双端队列)是 Python 内置的高效队列实现,支持从两端快速添加 / 删除元素
from collections import deque# 创建一个空队列
q = deque()# 入队(添加元素到末尾)
q.append("第一个元素")
q.append("第二个元素")
q.append("第三个元素")
print("队列内容:", list(q)) # 输出: ['第一个元素', '第二个元素', '第三个元素']# 出队(移除并返回头部元素)
first = q.popleft()
print("出队元素:", first) # 输出: 第一个元素
print("出队后队列:", list(q)) # 输出: ['第二个元素', '第三个元素']# 查看队列长度
print("队列长度:", len(q)) # 输出: 2# 检查队列是否为空
print("是否为空:", len(q) == 0) # 输出: False
2. 多线程场景:用 queue.Queue
实现队列
queue.Queue
是专门为多线程设计的,自带锁机制,确保多个线程同时操作时不会出现数据混乱(线程安全)
from queue import Queue
import threading
import time# 创建队列(可指定最大长度,超出则阻塞)
q = Queue(maxsize=3) # 最多容纳3个元素# 定义生产者线程:往队列中添加元素
def producer():for i in range(5):item = f"任务{i}"q.put(item) # 入队,如果队列满则阻塞等待print(f"生产了: {item},当前队列大小: {q.qsize()}")time.sleep(0.5) # 模拟耗时# 定义消费者线程:从队列中取元素
def consumer():for i in range(5):item = q.get() # 出队,如果队列为空则阻塞等待print(f"消费了: {item},当前队列大小: {q.qsize()}")q.task_done() # 通知队列该任务已处理完成time.sleep(1) # 模拟处理耗时# 启动线程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()# 等待所有任务处理完成
q.join() # 阻塞直到队列中所有元素都被处理并调用了task_done()
print("所有任务处理完毕")
操作 | deque (单线程) | Queue (多线程) | 说明 |
---|---|---|---|
入队 | append(item) | put(item) | 添加元素到队列末尾 |
出队 | popleft() | get() | 移除并返回头部元素 |
查看长度 | len(q) | qsize() | 获取当前元素数量 |
检查是否为空 | len(q) == 0 | empty() | 判断队列是否为空 |
等待所有任务完成 | 无 | join() | 多线程中等待所有任务处理 |
标记任务完成 | 无 | task_done() | 配合 join() 使用 |
123