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

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

本文详解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 相关产品和应用

全部下载

专题列表