一、Queue模块的知识点思维导图
二、Queue模块常用函数介绍
queue模块是内置的,不需要安装直接导入就可以了。
(1)创建一个Queue对象
import queue
# 创建一个队列实例
q = queue.Queue(maxsize=20) # 可选参数,默认为无限大
(2)入队
# 导入Python标准库中的queue模块,该模块提供了线程安全的队列数据结构
import queue
# 创建一个Queue对象,可以理解为初始化一个队列,参数maxsize默认为0,表示队列大小无限制
q = queue.Queue()
# 使用for循环将数字0到9依次放入队列中
# put方法用于将元素放入队列尾部,即执行入队操作
for i in range(10):
q.put(i) # 这里每执行一次,就将i(0-9)作为一个元素放入队列中
# 此时,队列q中按照先进先出(FIFO)原则存储了数字0-9
(3)出队
# 导入Python内置的queue模块,其中包含线程安全的队列数据结构
import queue
# 创建一个Queue对象,即初始化一个空队列
q = queue.Queue()
# 使用for循环将0到9这10个整数依次入队
# put方法将元素添加到队列的末尾
for i in range(10):
q.put(i) # 每次循环都将i作为元素放入队列中
# 此时q中已有元素,下面开始出队
# 出队的三种方式
q.get()
q.get_nowait()
q.get(block=False) # 和get_nowait()一样功能
# 循环出队
for i in range(q.qsize()):
print(q.get())
(4)判空
# 导入Python内置的queue模块,其中包含线程安全的队列数据结构
import queue
# 创建一个Queue对象,即初始化一个空队列
q = queue.Queue()
# 使用for循环将0到9这10个整数依次入队
# put方法将元素添加到队列的末尾
for i in range(10):
q.put(i) # 每次循环都将i作为元素放入队列中
# 使用while循环检查队列是否为空
# 当队列不为空时,持续执行循环体内的操作
while not q.empty():
# 使用get方法从队列中取出并移除一个元素
# 默认情况下,get方法会阻塞直到有元素可用(除非设置了非阻塞模式)
data = q.get()
# 打印从队列中取出的元素
print(data)
# 当队列为空时,while循环结束
# 此时所有之前入队的整数0-9会被按照先进先出(FIFO)的原则依次出队并打印
(5)判满
import queue
# 初始化一个容量为5的队列
q = queue.Queue(maxsize=5)
# 入队操作
for i in range(10):
# 在入队前检查队列是否已满
if q.full():
print("Queue is full, cannot insert more items.")
else:
q.put(i)
# 若队列已满,可以选择等待一段时间后重试或其他处理策略
if q.full():
time.sleep(1) # 假设休眠一秒后重试
continue
while not q.empty():
data = q.get()
print(data)
(6)获取队列长度
import queue
# 创建一个队列
q = queue.Queue()
# 将10个元素放入队列
for i in range(10):
q.put(i)
# 打印队列长度
print(f"Queue size before processing: {q.qsize()}")
# 处理队列中的元素,同时打印队列长度
while not q.empty():
data = q.get()
print(f"Processing element: {data}, current queue size: {q.qsize()}")
# 在处理过程中,每次从队列中取出一个元素后,队列长度都会减一
(7)task_done() 和 unfinished_tasks
import queue
import threading
# 创建一个队列
q = queue.Queue()
# 生产者线程将任务放入队列
def producer():
for i in range(10):
q.put(i)
print(f"Producer added task: {i}")
# 消费者线程从队列中取出并处理任务
def consumer():
while True:
task = q.get() # 获取任务
print(f"Consumer started working on task: {task}")
# 这里模拟任务处理过程
# 实际应用中,此处应替换为实际的任务处理逻辑
process_task(task)
# 任务处理完毕,调用 task_done()
q.task_done()
print(f"Consumer finished task: {task}")
# 检查队列是否为空且所有任务都已经完成
if q.empty() and q.unfinished_tasks == 0:
print("All tasks completed, exiting consumer.")
break
# 创建并启动生产者线程
p = threading.Thread(target=producer)
p.start()
p.join() # 确保生产者线程完成任务
# 创建并启动消费者线程
c = threading.Thread(target=consumer)
c.start()
c.join() # 等待消费者线程处理完所有任务并退出
# 由于消费者线程在所有任务完成后退出,所以在此处不需要再次检查队列状态
(8)join
import queue
import threading
# 创建一个队列
q = queue.Queue()
# 生产者线程将任务放入队列
def producer():
for i in range(10):
q.put(i)
print("Producer has added all tasks.")
# 消费者线程从队列中取出并处理任务
def consumer():
while True:
task = q.get() # 获取任务
print(f"Consumer started working on task: {task}")
# 这里模拟任务处理过程
# 实际应用中,此处应替换为实际的任务处理逻辑
process_task(task)
# 任务处理完毕,调用 task_done()
q.task_done()
print(f"Consumer finished task: {task}")
# 检查队列是否为空
if q.empty():
print("No more tasks in the queue.")
break
# 创建并启动生产者线程
p = threading.Thread(target=producer)
p.start()
p.join() # 确保生产者线程完成任务添加
# 创建并启动消费者线程
c = threading.Thread(target=consumer)
c.start()
# 主线程等待所有任务完成
q.join() # 阻塞主线程,直到所有从队列中取出的任务都被标记为完成
print("All tasks have been processed and marked as done.")