队列queue是典型的生产者、消费者模式,按从前往后的顺序、先进先出。
一、创建队列
下载安装第三方模块queue,然后导入,并创建队列对象。
import queue
q = queue.Queue(maxsize = 0)
可通过maxsize设置队列长度,默认值0表示队列无限长。
二、存放数据到队列
q.put(item,block = True,timeout = None)
item:放入queue里的内容,从尾部开始放
block:默认True,如果队列是满的,阻塞等待队列空出位置;可设置为False,队列满时抛出异常。
timeout:当block为True时,设置阻塞时间,过时抛出异常;默认一直等待。
q.put_nowait(item)
不阻塞,队列满时抛出异常。等效于:q.put(item,block =False)
三、从队列取数据
q.get(block = True,timeout = None)
block:默认True,如果队列是空的,阻塞等待队列里的内容;可设置为False,队列空时抛出异常。
timeout:当block为True时,设置阻塞时间,过时抛出异常;默认一直等待。
q.get_nowait()
不阻塞,队列为空时抛出异常。等效于:q.get(block = False)
# 队列:queue
# 生产者、消费者模式
import queue
import threading
def put(q,i):
print('put',i)
q.put(i,)
def get(q):
ret = q.get()
print('get',ret)
q = queue.Queue(5)
for i in range(20):
t = threading.Thread(target=put,args=(q,i,))
t.start()
for i in range(5):
t = threading.Thread(target=get,args=(q,))
t.start()
View Code
q.join()
当队列为空的时候,才能执行别的操作。若队列中存储的是任务,只有当当前任务全部执行,列表为空时,才可以进行后续操作。
五、其他
由于在多线程操作中,队列经常处于变化中,不可靠,所以如下几个方法不常用。
(一)q.qsize() 队列大小
(二)q.empty() 队列是否为空
(三)q.full() 队列是否为满