python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python中queue模块

Python中queue模块常用函数使用方法

作者:小oo呆

这篇文章主要介绍了Python的Queue模块,包括其基本概念、常用函数和用法,Queue模块是Python标准库中的一部分,无需额外安装即可使用,文中通过代码介绍的非常详细,需要的朋友可以参考下

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

总结 

到此这篇关于Python中queue模块常用函数使用的文章就介绍到这了,更多相关Python中queue模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文