Python自带的队列模块有4种队列:
FIFO:first in first out 先进先出
LIFO:last in first out 后进先出,类似于栈的数据结构
proiority:优先队列
deque: 双端队列
这一部分,先介绍FIFO模式的队列,后三种队列会在后续的文章种介绍
设置队列长度、进队列与出队列
from queue import Queue
#如果maxsize设置为小于0或者不设置,队列为无限长
que = Queue(maxsize=2)
#进队列
que.put(1)
#出队列
result = que.get()
#result结果:1
入队列时堵塞
from queue import Queue
#设置队列长度为1
que = Queue(maxsize=1)
#此时如果入队列两次, put将会一直堵塞,等待前一个出队列
que.put(1)
que.put(2)
入队列非堵塞
from queue import Queue
que = Queue(maxsize=1)
#设置block为False为非堵塞,默认block为True堵塞
try:
que.put(1)
#如果队列为满,非堵塞将会报异常
que.put(2,block=False)
except Exception:
pass
出队列堵塞
from queue import Queue
que = Queue(maxsize=2)
que.put(1)
que.get()
que.get()
#如果队列为空,get会一直等待
出队列非堵塞
from queue import Queue
que = Queue(maxsize=2)
que.put(1)
que.get()
try:
#如果设置为非堵塞,将会报异常
que.get(block=False)
except Exception:
pass
设置超时
from queue import Queue
que = Queue(maxsize=1)
que.put(1)
try:
#设置超时后,如果2秒后还不能进队列将会报异常
#在非堵塞的情况下,无需设置超时
que.put(2,timeout=2)
except Exception:
pass
que.get()
try:
#设置超时后,如果2秒后队列仍是空将会报异常
#在非堵塞的情况下,无需设置超时
que.get(timeout=2)
except Exception:
pass
队列中还有两个方法put_nowait和get_nowait,这两个方法相对于put(item,block=False),get(block=False)
join( )与task_done( )的关系,在多线程中,队列设置join后,将会一直等待队列为空才会结束,而task_done就是告诉join何时结束,但是如果队列仍有数据,就算写了task_done程序依然会一直堵塞,这是一个对队列的保护措施。
from queue import Queue
from threading import Thread
import time
que = Queue()
def task(value):
global que
que.put(value)
# que.put(value)
def task2():
global que
res = que.get()
print(res)
que.task_done()
t1 = Thread(target=task, args=(10,))
t2 = Thread(target=task2)
t1.start()
t2.start()
t1.join()
t2.join()
que.join()
下面还有几个基本的操作:
que.empty() 判断队列是否为空,如果为空返回True,反之返回False
que.full() 判断队列是否为满,如果为满返回True,反之返回False
que.qsize() 返回当前队列有多少成员
que.maxsize 返回队列的最大长度