Python线程队列queue模块详解:方法、优先级与异常处理
本文深入解析Python中threading模块的queue队列用法。涵盖Queue、LifoQueue及PriorityQueue三种核心队列的创建与数据存取方式,详细讲解put/get方法的阻塞机制、task_done与join的任务追踪逻辑,以及Empty和Full异常的处理。通过代码示例展示先进先出、后进先出及基于优先级的数据调度策略,帮助开发者实现安全高效的多线程通信。
线程队列基础与核心方法
一、线程队列
在Python中,queue队列的使用方式与进程间的Queue类似,均用于线程间的数据交换。
当需要在多个线程之间安全地交换信息时,队列机制在线程编程中显得尤为重要。
重要:
关于q.put()方法:向队列中放入值。当参数block为True时,timeout参数生效。若队列已满,程序将等待timeout指定的时间,超时后报错;若block为False,程序不等待直接报错。
关于q.get()方法:从队列中取值。当参数block为True时,timeout参数生效。若队列已空,程序将等待timeout指定的时间,超时后报错;若block为False,程序不等待直接报错。
关于q.task_done() 方法:使用者调用此方法发出信号,表明q.get()返回的项目已被处理。若调用次数超过从队列中删除的项目数量,将引发ValueError异常。
关于q.join() 方法:生产者使用此方法进行阻塞,直到队列中所有项目均被处理完毕。阻塞将持续到为队列中的每个项目均调用q.task_done()方法为止。
线程队列的取值方式
二、线程队列的取值方式
2.1 先进先出
class queue.Queue(maxsize=0)
使用q = queue.Queue():不加参数代表队列可以无限的放数据
q = queue.Queue() #不加参数代表队列可以无限的放数据
q.put('Cecilia陈')
q.put('xichen')
print(q.get())
print(q.get())
'''
结果:
Cecilia陈
xichen
'''
2.2 后进先出
class queue.LifoQueue(maxsize=0)
使用q = Lifo.Queue():不加参数代表队列可以无限的放数据
q = queue.LifoQueue() #不加参数代表队列可以无线的放数据
q.put('Cecilia陈')
q.put('xichen')
print(q.get())
print(q.get())
'''
结果:
xichen
Cecilia陈
'''
优先级队列与异常处理
三、队列存数据时可以设置优先级
class queue.priorityQueue(maxsize=0)
使用q = queue.priorityQueue():不加参数代表队列可以无限的放数据
3.1 优先级队列
# 3.优先级队列
q = queue.PriorityQueue() #不加参数代表队列可以无线的放数据
#put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
q.put((2,'Cecilia陈'))
q.put((1,'xichen'))
q.put((5,'xuchen'))
print(q.get())
print(q.get())
print(q.get())
'''
# 结果(数字越小优先级越高,优先级高的优先出队):
结果:
(1, 'xichen')
(2, 'Cecilia陈')
(5, 'xuchen')
'''
3.2 方法说明
关于maxsize参数:它是一个整数,设置可以放置在队列中的项数的上限。一旦达到此大小,插入将阻塞,直到使用队列项。如果maxsize小于或等于零,则队列大小为无穷大。
关于p.put() 方法:放值的时候,放的是一个元组()
关于exception queue.Empty异常:queue.Empty。当对空的队列对象调用非阻塞 get() 或 get_nowait() 时引发异常,也就是说队列为空的时候,再取值就会报错。
关于exception queue.Full 异常:queue.Full。当对已满的队列对象调用非阻塞put() 或 put_nowait() 时引发异常。也就是说当队列已满的时候,再往里面放值的时候将会报错。
Queue.qsize () :
关于empty()方法:如果为空,返回True
关于Queue.full()方法:如果已满,返回True
关于put_nowait(item)方法:等同于put(item, False)。
关于get_nowait() 方法:等同于get(False)。
提供了两种方法来支持跟踪已加入队列的任务是否已被守护进程使用者线程完全处理:
关于task_done() 方法:表示以前加入队列的任务已经完成。由队列使用者线程使用。对于用于获取任务的每个get(),后续对task_done()的调用告诉队列任务上的处理已经完成。如果join(当前处于阻塞状态,那么在处理完所有项之后,它将继续运行(这意味着对于已经放入队列()的每个项,都收到了task_done()调用)。
如果调用次数超过放置在队列中的项的次数,则引发ValueError。
关于Queue.join()方法:块直到队列被消费完毕。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













