Python队列模块详解:Queue、LifoQueue与PriorityQueue用法指南

叶初
叶初
发布时间:2026-10-16| 8人浏览过
原创

本文详细介绍Python标准库中queue模块的四种队列类型:先进先出(FIFO)、后进先出(LIFO)、优先级队列及SimpleQueue。重点解析Queue、LifoQueue和PriorityQueue对象的常用方法,包括put/get操作、block与timeout参数控制、qsize/empty/full状态判断,以及task_done和join的任务追踪机制,帮助开发者掌握并发编程中的队列应用。

Python queue队列类型及函数

1.队列的种类

Python的queue模块提供了多种队列实现,其中FIFO(先进先出)队列是最基础的一种,通过class queue.Queue(maxsize)创建。

LIFO(后进先出)队列的行为类似于堆栈,元素最后进入最先被取出,通过class queue.LifoQueue(maxsize)创建。

此外还有优先级队列,其特点是级别越低的元素越先被取出,通过class queue.PriorityQueue(maxsize)创建。

import queue

# 先进先出队列
queue_obj = queue.Queue()

for i in range(3):
    queue_obj.put(i)

for i in range(3):
    print(queue_obj.get())

"""执行结果
0
1
2
"""

# 先进后出队列,类似于堆栈
queue_obj = queue.LifoQueue()

for i in range(3):
    queue_obj.put(i)

for i in range(3):
    print(queue_obj.get())

"""执行结果
2
1
0
"""

# 优先级队列
import Queue
import threading

class Job(object):
    def __init__(self, priority, description):
        self.priority = priority
        self.description = description
        print 'Job:',description
        return
    def __cmp__(self, other):
        return cmp(self.priority, other.priority)

q = Queue.PriorityQueue()

q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))

def process_job(q):
    while True:
        next_job = q.get()
        print 'for:', next_job.description
        q.task_done()

workers = [threading.Thread(target=process_job, args=(q,)),
        threading.Thread(target=process_job, args=(q,))
        ]

for w in workers:
    w.setDaemon(True)
    w.start()

q.join()

2.队列函数

maxsize = 10
queue_obj = queue.Queue(maxsize)  # maxsize 代表队列的上限, 如果队列已满, 则插入时需要等待, maxsize为零或负数时.队列没有限制

queue_obj.get(block=True, timeout=None)  # block为True时,表示等待获取,直至timeout超时
queue_obj.get_nowait()  # 当获取不到元素时,报错

queue_obj.put(item="待插入的元素", block=True, timeout=None)  # block为True时,表示等待插入,直至timeout超时
queue_obj.put_nowait('待插入的元素')  # 当不能插入元素时报错

queue_obj.empty()  # 队列为空时,返回True

queue_obj.full()  # 如果队列满时,返回True

queue_obj.task_done()  # 在每次获取队列中的元素, 操作完成之后, 调用该函数告诉队列我已经使用完成, 主要是给join函数使用
queue_obj.join()  # 等待队列内的元素全部被获取后, 再接触阻塞(直至所有的任务全部task_done)

"""下面的例子验证toask_done和join的关系"""
for i in range(3):
    queue_obj.put(i)  # 这里像队列中添加三个元素

queue_obj.get()  # 这里获取队列中的消息
queue_obj.task_done()

queue_obj.get()  # 这里获取队列中的消息
queue_obj.task_done()

queue_obj.get()  # 这里获取队列中的消息
queue_obj.task_done()

queue_obj.join()
print('直至队列中的所有元素全部都被取出, join函数才不会阻塞, 如果只执行了两次task_done函数, 则join会一直阻塞')

python 队列类及其方法

1.Python的队列类型

from queue import Queue, LifiQueue, PriorityQueue, SimpleQueue
  • FIFO(先入先出)Queue(maxsize=0):这是FIFO队列的构造函数。maxsize是一个整数,用于设置放入队列中数据的上限。一旦达到此大小,插入将被阻塞。如果maxsize<=0,则队列大小为无限。
  • LIFO(后进先出)LifoQueue(maxsize=0):这是LIFO队列的构造函数,其他参数含义同上。
  • 优先级队列 PriorityQueue(maxsize=0):这是优先级队列的构造函数,其他参数含义同上。
  • SimpleQueue:这是FIFO队列的简单形式,缺少诸如任务跟踪之类的高级功能。
  • Empty:这是在空对象上调用get()方法时引发的异常类。
  • Full:这是在已满的对象上调用put()方法时引发的异常类。

2.队列对象(适用Queue、LifoQueue和PriorityQueue)

qsize()

  • 返回队列的大小。
  • 注意qsize()>0不能保证后续的get()不会阻塞,qsize()<maxsize也不能保证对get()的后续调用不会阻塞。

empty()

  • 如果队列是空的返回True,否则返回False。
  • 如果返回True不能保证后续对put()的调用都不会阻塞。如果返回False也不能保证对get()的后续调用不会阻塞。

full()

  • 如果队列满了返回True,否则返回False。
  • 如果返回True不能保证对get()的后续调用不会阻塞。如果full返回False也不能保证后续对put()的调用不会阻塞。

put(item, block=True, timeout=None)

  • 将数据插入队列中。
  • 如果block=True, timeout=None则在必要时进行阻塞,直到队列有空间为止。如果timeout=正数,则它最多超时正数秒。Full队列如果在该时间内没有空间可用,会引发异常。如果block=False,队列有空间,则将数据放入队列(超时被忽略),否则引发Full异常。

put_nowait(item)

  • 等同于put(item, False)。

get(block=True, timeout=None)

  • 从队列中删除并返回一个数据。
  • 如果block=True, timeout=None则在必要时进行阻塞,直到队列有数据为止。如果timeout=正数,则它最多超时正数秒。Empty队列如果在该时间内没有数据可用,会引发异常。如果block=False,队列有数据,则会返回一个数据(超时被忽略),否则引发Empty异常。

get_nowait()

  • 等同于get(False)。

task_done()

  • 表示先前排队的任务已完成。

join()

  • 阻塞直到队列中的所有数据都已获得处理。每当将项目添加到队列时,未完成任务的数量就会增加。每当使用者线程调用task_done()以指示已检索到该项目并且该项目的所有工作完成时,该计数就会减少。当未完成的任务数降至零时,join()取消阻止。

3.SimpleQueue对象

qsize()
empty()
put(item, block = True, timeout = None )
put_nowait(item)
get(block = True,timeout = None)
get_nowait(item)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。