Python Queue模块详解:FIFO、LIFO与优先级队列及常用方法
本文详解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放入队列中。
- 若可选参数block为True且timeout为None(默认情况),则阻塞调用,无超时限制。
- 若timeout为正整数,阻塞调用进程最多等待timeout秒;若期间仍无可用空间,则抛出Full异常(带超时的阻塞调用)。
- 若block为False,当有可用空间时将数据放入队列,否则立即抛出Full异常。
- 其非阻塞版本为put_nowait,等同于put(item, False)。
get([block[, timeout]])
从队列中移除并返回一个数据项。block和timeout参数的行为与put方法相同。
其非阻塞版本为get_nowait(),等同于get(False)。
empty()
如果队列为空,返回True;否则返回False。
以上是对Python队列Queue模块的详细介绍,希望能对大家有所帮助。如有疑问欢迎留言,小编会及时回复。感谢大家对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









