queue模块可以创建先进先出fifo队列,后进先出lifo队列,优先priority队列
queue模块队列对象
类名 | 说明 |
Queue(maxsize=0) | 创建先进先出队列,maxsize=0为无限队列,可以指定maxsize一个值,如果队列长度达到maxsize,那么将会阻塞,直到队列长度小于maxsize |
LifoQueue(maxsize=0) | 创建后进先出队列 |
PriorityQueue(maxsize=0) | 创建优先队列 |
队列对象方法
从队列中获取一个元素,如果block为True,则会阻塞到有可用item为止,如果设定了timeout值,则会最多阻塞timeout秒
方法名 | 说明 |
qsize() |
返回队列大小,由于队列会被其他线程修改,所以该值为近似值 |
empty() |
如果队列为空,返回True,否则返回False |
full() |
如果队列满,返回True,否则返回False |
put(item, block=True, timeout=None) |
将item放入队列,如果block为True,且timeout为None,则在有空间之前阻塞,如果timeout设定了值,则在阻塞时间为timeout秒,如果block=False,则会抛出Empty异常 |
put_nowait(item) |
相当于put(item, block=False) |
get(block=True, timeout=None) |
从队列中获取一个item,如果block为True,当队列为空时,将一直阻塞到队列可用,如果timeout被指定,将阻塞timeout秒,然后抛出Empty错误 |
get_nowait() |
相当于get(Flase) |
task_done() |
用于表示队列中的某个元素已执行完毕,该方法会被下面的join()使用 |
join() |
在队列中所有元素执行完毕并在调用task_done()信号之前,保持阻塞 |
队列异常
异常 | 说明 |
Empty |
对空队列调用get()时抛出 |
Full |
对已满队列调用put()时抛出 |
生产者与消费者
在队列的使用中,线程角色通常分为生产者与消费者两种角色,生产者负责向队列写入元素,消费者从队列中get元素
队列举例
from threading import Thread
from queue import Queue
from random import randint
from time import sleep
def writeQ(queue):
print("插入队列...")
queue.put('x', 1)
print("队列长度",queue.qsize())
def readQ(queue):
print("从队列中读取...")
val = queue.get(1)
print("队列长度",queue.qsize())
def writer(queue, loops):
for i in range(loops):
writeQ(queue)
sleep(randint(1,3))
def reader(queue, loops):
for i in range(loops):
readQ(queue)
sleep(randint(2,5))
if __name__ == "__main__":
nloops = randint(2,5)
q = Queue()
threads = []
t = Thread(target=writer, args=(q, nloops))
t.start()
t = Thread(target=reader, args=(q,nloops))
t.start()
输出
插入队列...
队列长度 1
从队列中读取...
队列长度 0
插入队列...
队列长度 1
从队列中读取...
队列长度 0
插入队列...
队列长度 1
从队列中读取...
队列长度 0
讨论区