当前位置: 首页 > 科技观察

Python数据结构的队列

时间:2023-03-12 04:04:46 科技观察

python内置的队列模块实现了三种类型的队列,所以不需要重新造轮子,它们的区别只是取项的顺序不同。在FIFO队列中,先添加的任务先被检索。在LIFO队列中,首先检索最近添加的条目(像堆栈一样操作)。在优先级队列中,条目保持排序(使用heapq模块)并且首先返回具有最低值的条目。classqueue.Queue(maxsize=0)FIFO先进先出队列构造函数。maxsize是一个整数,它设置可以放入队列的项目数的上限。当达到这个大小时,插入操作将阻塞,直到队列中的项目被消耗完。如果maxsize小于或等于零,则队列大小是无限的。maxsize是一个整数,它设置了可以放置在队列中的项目数的上限。classqueue.LifoQueue(maxsize=0)LIFOLIFO队列构造函数。maxsize是一个整数,它设置可以放入队列的项目数的上限。当达到这个大小时,插入操作将阻塞,直到队列中的项目被消耗完。如果maxsize小于或等于零,则队列大小是无限的。classqueue.PriorityQueue(maxsize=0)PriorityQueue优先队列构造函数。maxsize是一个整数,它设置可以放入队列的项目数的上限。当达到这个大小时,插入操作将阻塞,直到队列中的项目被消耗完。如果maxsize小于或等于零,则队列大小是无限的。一般方法:Queue.qsize()返回队列的大概大小Queue.empty()如果队列为空则返回True,否则返回False。如果队列已满,则Queue.full()返回True,否则返回False。Queue.put(item,block=True,timeout=None)将项目放入队列。如果可选参数block为true且timeout为None(默认值),则在必要时阻塞,直到有空闲插槽可用。如果超时是正数,将阻塞最多超时秒数,如果在此期间没有空闲插槽可用,则会引发Full异常。否则(block为false),如果空闲插槽立即可用,则将项目放入队列中,否则引发Full异常(在这种情况下超时将被忽略)。Queue.put_nowait(item)等同于put(item,False)。Queue.get(block=True,timeout=None)从队列中移除并返回一个项目。如果可选参数块为真且超时为无(默认值),则在必要时阻塞直到项目可用。如果timeout是一个正数,它最多会阻塞timeout秒,如果该项目在这段时间内不可用,则会引发Empty异常。否则(块为false),如果项目立即可用,则返回一个项目,否则会引发Empty异常(在这种情况下忽略超时)。Queue.get_nowait()等同于get(False)。提供了两种方法来支持跟踪排队的任务是否已被守护进程消费者线程完全处理。Queue.task_done()表示之前排队的任务已经完成。由队列的使用者线程使用。每个get()用于获取任务,随后对task_done()的调用告诉队列该任务的处理已完成。如果join()当前处于阻塞状态,它将在处理完所有条目后解除阻塞(意味着已接收到每个put()排队条目的task_done())。如果调用的次数多于放入队列的项目数,则会引发ValueError异常。Queue.join()阻塞,直到接收并处理队列中的所有元素。当条目添加到队列中时,未完成任务的计数会增加。每当消费者线程调用task_done()以指示条目已被回收并且条目的所有工作已完成时,未完成的计数就会减少。当未完成的计数下降到零时,join()被解除阻塞。代码如下:#!/usr/bin/envpython#-*-coding:UTF-8-*-#_ooOoo_#o8888888o#88"."88#(|-_-|)#O\=/O#____/`---'\____#.'\\||//`.#/\\|||:|||//\#/_|||||-:-|||||-\#||\\\-///||#|\_|''\---/''|_/|#\.-\__`-`___/-./#___`..'/--.--\`..__#.""'<`.___\_<|>_/___.'>'"".#||:`-\`.;`\_/`;.`/-`:||#\\`-.\___\/___/.-`//#==`-.____`-.___\_____/___.-`____.-'==#`=---=''''@Project:pythonalgorithms@File:queuedatastructure.py@Author:无敌人生一醉@Date:2021/7/151:53'''fromqueueimportQueue,LifoQueue,PriorityQueue,SimpleQueueimportrandomif__name__=='__main__':q=Queue()#先进先出队列lq=LifoQueue()#高级厨房队列pq=PriorityQueue()#优先队列sq=SimpleQueue()#简单队列#插入队列数据foriinrange(10):q.put(i)lq.put(i)pq.put(random.randint(1,20),i)sq.put(i)foriinrange(10):print(q.get(),end='')#0123456789print('\r')foriinrange(10):print(lq.get(),end='')#9876543210print('\r')foriinrange(10):print(pq.get(),end='')#671316171818192020print('\r')foriinrange(10):print(sq.get(),end='')#0123456789q=队列(3)print('\r')print('queue.qsize=',q.qsize())#queue.qsize=0print('queue.empty=',q.empty())#queue.empty=Trueq。put(5)q.put(9)q.put(1)print('queue.full=',q.full())#queue.full=True#q.put(10)#print(q)#q.put(11,block=True,timeout=1)#timeout=1秒时,返回raiseFull#print(q)#q.put(11,block=False,timeout=1)#立即返回raiseFull,忽略时间#print(q)的输出是: