Python多线程基础——01、队列queue模块使用
发布时间:2026/10/23 2:50:14 锦皓数字建站

摘要本文系统讲解 Python 标准库 queue 模块中的三种队列先进先出队列 Queue()、后进先出队列 LifoQueue() 以及优先队列 PriorityQueue()。文章从队列的创建与基本用法入手重点剖析 put() 和 get() 方法在满队列、空队列场景下的阻塞行为并介绍 empty()、full() 等状态判断方法最后通过魔术方法演示如何构造可比较对象以支持优先队列的排序需求。目录一、先进先出FIFO队列——Queue()1.1、put()方法用法满队列使put()陷入等待1.2、get()方法用法空队列使get()陷入等待1.3、empty()方法1.4、full()方法1.5、get()和put()方法阻塞的释放二、后进先出LIFO队列——LifoQueue()三、优先队列Priority——PriorityQueue()压入队列的元素之间必须可比较通过魔术方法创建可比较对象一、先进先出FIFO队列——Queue()可设为无穷队列或有穷队列。库原型 class Queue: Create a queue object with a given maximum size. If maxsize is 0, the queue size is infinite. def __init__(self, maxsize0): self.maxsize maxsize ...... 导入方式 from Queue import queue1.1、put()方法用法方法原型 ef put(self, item, blockTrue, timeoutNone):按顺序依次将对象压入队列实例。q Queue() q.put(1) q.put(2) q.put(3)满队列使put()陷入等待该情况仅针对有限长度队列即q queue(maxsize)无穷等待设置队列长度为3第四次put()元素时当前线程将被阻塞IO阻塞直到队列中有空间。设置队列长度为3 q Queue(3) q.put(1) q.put(2) q.put(3) 试图加入第四个元素 q.put(4)有穷等待设置队列长度为3 q Queue(3) q.put(1) q.put(2) q.put(3) 试图加入第四个元素线程被阻塞六秒之后抛出异常Full q.put(4, timeout6)不等待设置队列长度为3 q Queue(3) q.put(1) q.put(2) q.put(3) 试图加入第四个元素不会阻塞线程直接抛出异常Full q.put(4, blockFalse)1.2、get()方法用法方法原型 def get(self, blockTrue, timeoutNone):从队列中取出对象返回取出的对象本身。遵循FIFO原则取出的值依次为12此时队列中仅剩3。q Queue() q.put(1) q.put(2) q.put(3) print(q.get()) print(q.get())空队列使get()陷入等待无穷等待队列中元素数量有限get()次数超过队列长度时默认get()方法所处线程将被阻塞IO阻塞直到队列中有元素。q Queue() q.put(1) q.put(2) print(q.get()) print(q.get()) 第三次get() print(q.get())像队列中put两个元素后当前线程执行到队列对象的第三次get()方法时将发生阻塞。限时等待q Queue() q.put(1) q.put(2) print(q.get()) print(q.get()) 第三次get()并限制等待时长为6s print(q.get(timeout6))第三次get()方法将阻塞所在线程长达6秒6秒后抛出empty异常。不等待q Queue() q.put(1) q.put(2) print(q.get()) print(q.get()) 第三次get()由于两次get()已经将队列取空此时直接抛异常empty print(q.get(blockFalse))1.3、empty()方法判断队列是否为空返回是否为空队列的判断结果。q Queue() 第一次判断队列对象创建时为空返回True print(q.empty()) q.put(1) q.put(2) q.put(3) print(q.get()) print(q.get()) 第二次判断队列对象被get()两次此时队列中仅剩3不为空返回Flase print(q.empty()) print(q.get()) 第三次判断队列对象被第三次get()后队列为空返回True print(q.empty())1.4、full()方法判断有穷队列是否已满返回队列是否已满的判断结果。q Queue(5) q.put(1) q.put(2) q.put(3) 第一次判断队列中有3个元素未满返回False print(q.full()) q.put(4) q.put(5) 第二次判断队列中新增2个元素已满返回True print(q.full())1.5、get()和put()方法阻塞的释放q Queue() def putdata(): time.sleep(3) q.put(test) t threading.Thread(targetputdata, daemonTrue) t.start() 子线程启动后3秒后向队列中加入元素test 情况一线程阻塞IO阻塞此时等待IO事件发生队列中有元素3秒后事件发生取出元素test q.get() 情况二线程阻塞6秒6秒内事件发生队列中有元素取出元素test,超时抛异常empty q.get(timeout6) 情况三当前不阻塞直接抛异常Empty q.get(False)同理对于put(True)方法队列为空无法去除则阻塞限定时间内队列依旧为空则抛异常。二、后进先出LIFO队列——LifoQueue()除了元素压入和取出顺序与FIFO队列相反其他方法与Queue()一致。库原型 class LifoQueue(Queue): Variant of Queue that retrieves most recently added entries first. ...... 导入方式 from Queue import LifoQueue三、优先队列Priority——PriorityQueue()优先队列的方法与Queue一致其遵循的是按照优先级排序绝对谁先出因此优先队列要求元素之间必须是可比较的。库原型 class PriorityQueue(Queue): Variant of Queue that retrieves open entries in priority order (lowest first). Entries are typically tuples of the form: (priority number, data). ...... 导入方式 from Queue import PriorityQueue压入队列的元素之间必须可比较q PriorityQueue() q.put(2) q.put(3) q.put(1) print(q.get()) print(q.get()) print(q.get()) 此时队列中元素优先级排序为1 2 3q PriorityQueue() q.put(2) q.put(3) q.put(1) print(q.get()) print(q.get()) q.put(1) print(q.get()) print(q.get()) 每次压入元素优先队列都会对队列中的元素重新排序q PriorityQueue() q.put(2) q.put(3) q.put(1) print(q.get()) print(q.get()) q.put(b) q.put(a) print(q.get()) print(q.get()) 任何时刻队列中的元素之间必须可比较否则抛TypeError异常 not supported between instances of str and int 通过魔术方法创建可比较对象方法原型含义def __eq__(self, other):def __lt__(self, other):def __le__(self, other):只需要以上三个方法和比较运算将自动生成。定义可比较类class Student: def __init__(self, name, genderM): self.name name self.gender gender def __eq__(self, other): return self.name other.name and self.gender other.gender def __lt__(self, other): s1 f{self.gender}:{self.name} s2 f{other.gender}:{other.name} return s1 s2 def __le__(self, other): return self other or self other def __repr__(self): # “调试表示”定义 repr(obj) 和交互式环境中直接输入对象时的输出 return {} {}.format(self.name, self.gender)可比较对象q PriorityQueue() q.put(Student(Alice, F)) q.put(Student(Blice, F)) q1 q.get() q2 q.get() print(q1, q2, q1 q2)Alice F Blice F False优先队列的元素排序将按照__lt__方法进行q PriorityQueue() for name in (tom, jerry, sam, ben, john): q.put(Student(name)) q.put(Student(Alice, F)) for i in range(6): print(q.get())Alice F ben M jerry M john M sam M tom M
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。