队列

队列

队列类似于一条管道,元素先进先出,进put(arg),取get()
有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态.

队列分类

队列有很多中,但都依赖模块queue

队列方式	特点
queue.Queue	先进先出队列
queue.LifoQueue	后进先出队列
queue.PriorityQueue	优先级队列
queue.deque	双线队列

队列的方法

方法	用法说明
put	放数据,Queue.put()默认有block=True和timeout两个参数。当block=True时,写入是阻塞式的,阻塞时间由timeout确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常
get	取数据(默认阻塞),Queue.get([block[, timeout]])获取队列,timeout等待时间
empty	如果队列为空,返回True,反之False
qsize	显示队列中真实存在的元素长度
maxsize	最大支持的队列长度,使用时无括号
join	实际上意味着等到队列为空,再执行别的操作
task_done	在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
full	如果队列满了,返回True,反之False

示例一

# 导入队列
from queue import Queue

# 最多接收3个数据
q = Queue(3)

# put 向队列中添加数据
q.put(1)
q.put(2)
q.put(3)

# 获取当前队列长度
print(q.qsize())

# 取出最前面的一个数据 1 , 还剩两个
print(q.get())

# 再加入数据
q.put(4)

#超过三个了.如果没有timeout参数会处于阻塞状态,卡在那边.若设置2秒,2秒后会raise 一个 FULL的报错
q.put(5, timeout=2))

# 当然,也可以直接给个 block=False,强制设置为不阻塞(默认为会阻塞的),一旦超出队列长度,立即抛出异常
q.put(6, block=False)

# 同样的,当取值(get)的次数大于队列的长度的时候就会产生阻塞,设置超时时间意为最多等待x秒,队列中再没有数据,就抛出异常.
  也可以使用block参数,跟上面一样

示例二:join & task_done

empty: 检查队列是否为空,为空返回True,不为空返回False
full : 判断队列是否已经满了

join & task_done :
#举例
from queue import Queue
q = queue.Queue(2)
q.put('a')
q.put('b')
# 程序会一直卡在下面这一行,只要队列中还有值,程序就不会退出
q.join()
-------------------------------------------------------------
q = queue.Queue(2)
q.put('a')
q.put('b')

q.get() 
q.get()
# 插入两个元素之后再取出两个元素,执行后发现,程序还是卡在下面的那个join代码
q.join()
-------------------------------------------------------------
q = queue.Queue(2)
q.put('a')
q.put('b')

q.get()
# get取完队列中的一个值后,使用task_done方法告诉队列,我已经取出了一个值并处理完毕,下同
q.task_done() 
q.get()
#在每次get取值之后,还需要在跟队列声明一下,我已经取出了数据并处理完毕,这样执行到join代码的时候才不会被卡住
q.task_done()
q.join()
posted @ 2020-04-04 20:08  阿浪阿浪  阅读(169)  评论(0编辑  收藏  举报