【学习心得】Python中的queue模块使用

一、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.")

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值