python:queue(队列)

360 阅读2分钟

1/什么是queue(队列)

Python的queue模块中提供了同步的、线程安全的队列类,
包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。
这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。
from queue import Queue,LifoQueue,PriorityQueue

2/queue队列的常用类属性和方法

这里以Queue先入先出类为例:

Queue.qsize() 返回队列的大小,也就是队列中元素的个数
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
Queue.get([block[, timeout]])获取队列,timeout等待时间,从队列中取出元素,配合task_down()使用,计数器-1

Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
Queue.put(item) 写入队列,timeout等待时间,往队列中添加元素,计数器会+1
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。

Queue.join() 实际上意味着等到队列为空,再执行别的操作

3/代码实例

from Queue import Queue,LifoQueue,PriorityQueue

# 实例化一个先进先出队列
# 规定了该队列的大小
q = Queue(maxsize=5) 

# 实例化一个后进先出队列
# 规定了队列的大小
lq = LifoQueue(maxsize=6)

# 实例化一个优先级队列
# 规定了队列的大小
pq = PriorityQueue(maxsize=5)

# 往队列中添加元素
for i in range(5):
    q.put(i)
    lq.put(i)
    pq.put(i)
    
print("先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full()))
print("后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()))
print("优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full()))
 
# get()方法,从队列中取出元素,因为是先进先出对了,所以先取出的是当时先put()进去的元素
print( q.get(),lq.get(),pq.get() )
 
print("先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full()))
print("后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()))
print("优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full()))