Python基础(①⑧Queue)

Python 标准库提供了两种常用的队列工具:

queue.Queue:用于多线程间的安全通信(线程安全)

collections.deque:更轻量的队列实现,适合单线程场景

1. 单线程场景:用 collections.deque 实现队列

deque(双端队列)是 Python 内置的高效队列实现,支持从两端快速添加 / 删除元素

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 是专门为多线程设计的,自带锁机制,确保多个线程同时操作时不会出现数据混乱(线程安全)

python 复制代码
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

相关推荐
lichong9511 小时前
Git 检出到HEAD 再修改提交commit 会消失解决方案
java·前端·git·python·github·大前端·大前端++
Tiny番茄1 小时前
31.下一个排列
数据结构·python·算法·leetcode
_Aaron___2 小时前
List.subList() 返回值为什么不能强转成 ArrayList
数据结构·windows·list
小白学大数据2 小时前
实战:Python爬虫如何模拟登录与维持会话状态
开发语言·爬虫·python
FriendshipT2 小时前
目标检测:使用自己的数据集微调DEIMv2进行物体检测
人工智能·pytorch·python·目标检测·计算机视觉
magic334165633 小时前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
平谷一勺3 小时前
数据清洗-缺失值的处理
python·数据分析
末世灯光3 小时前
时间序列入门第一问:它和普通数据有什么不一样?(附 3 类典型案例)
人工智能·python·机器学习·时序数据
开心-开心急了3 小时前
Flask入门教程——李辉 第一、二章关键知识梳理(更新一次)
后端·python·flask
锦***林3 小时前
用 Python 写一个自动化办公小助手
开发语言·python·自动化