Python Queue模块详解:FIFO、LIFO与优先级队列及常用方法

Dylan
Dylan
发布时间:2026-10-13| 6人浏览过
原创

本文详解Python标准库Queue模块,涵盖FIFO、LIFO及优先级队列三种实现方式。通过代码示例展示基本用法,并深入解析put、get、task_done及join等核心方法,帮助开发者在多线程环境中高效进行数据传递与同步控制。

Python Queue模块概述

Queue

Queue是Python标准库中提供的线程安全队列(FIFO)实现,专为多线程编程设计。它提供了一种先进先出的数据结构,用于在生产者线程和消费者线程之间安全地传递信息。

基本FIFO队列

基本FIFO队列

class Queue.Queue(maxsize=0)

FIFO(First In First Out)意为先进先出。Queue模块提供了一个基础的FIFO容器,使用方式简单直观。参数maxsize为整数,指定队列中可容纳的数据项上限。当队列达到最大容量时,插入操作会导致阻塞,直到有数据被消费。若maxsize小于或等于0,则队列大小不受限制。

示例如下:


import Queue

q = Queue.Queue()

for i in range(5):
  q.put(i)

while not q.empty():
  print q.get()

输出结果:

0 1 2 3 4

LIFO队列实现

LIFO队列

class Queue.LifoQueue(maxsize=0)

LIFO(Last In First Out)意为后进先出,行为类似于栈结构。其使用方法与FIFO队列类似,maxsize参数的作用也相同。

示例如下:


import Queue

q = Queue.LifoQueue()

for i in range(5):
  q.put(i)

while not q.empty():
  print q.get()

输出结果:

4 3 2 1 0

可见,只需将Queue.Queue类替换为Queue.LifoQueue类即可实现后进先出的逻辑。

优先级队列应用

优先级队列

class Queue.PriorityQueue(maxsize=0)

构造一个优先级队列,maxsize参数的用法与前两者一致。


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()

运行结果

Job: level 3 job Job: level 10 job Job: level 1 job for: level 1 job for: level 3 job for: job: level 10 job

Queue常用方法详解

常用方法说明

task_done()

该方法表示之前入队的一个任务已完成,通常由消费者线程调用。每当调用get()获取一个任务后,应调用task_done()告知队列该任务已处理完毕。

如果当前有线程正在阻塞等待join(),当队列中所有任务均处理完毕(即每个put()入队的任务都有对应的task_done()调用)时,join()将解除阻塞并恢复执行。

join()

阻塞调用线程,直到队列中的所有任务都被处理完毕。

每当有数据加入队列,未完成的任务计数增加;当消费者线程调用task_done()(表示任务已取出并处理)时,未完成计数减少。当计数降至0时,join()解除阻塞。

put(item[, block[, timeout]])

将item放入队列中。

  1. 若可选参数block为True且timeout为None(默认情况),则阻塞调用,无超时限制。
  2. 若timeout为正整数,阻塞调用进程最多等待timeout秒;若期间仍无可用空间,则抛出Full异常(带超时的阻塞调用)。
  3. 若block为False,当有可用空间时将数据放入队列,否则立即抛出Full异常。
  4. 其非阻塞版本为put_nowait,等同于put(item, False)。

get([block[, timeout]])

从队列中移除并返回一个数据项。block和timeout参数的行为与put方法相同。

其非阻塞版本为get_nowait(),等同于get(False)。

empty()

如果队列为空,返回True;否则返回False。

以上是对Python队列Queue模块的详细介绍,希望能对大家有所帮助。如有疑问欢迎留言,小编会及时回复。感谢大家对本站的支持!

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

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 算法库。