Queue队列类型
FIFO
FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
LIFO
LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
priority
构造一个优先队列。maxsize用法同上
使用方法
方法 | 描述 |
---|---|
Queue.qsize() | 返回队列大小 |
Queue.empty() | 判断队列是否为空 |
Queue.full() | 判断队列是否满了 |
Queue.get([block[,timeout]]) | 从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有item出现为止来get出这个item。如果是False的话表明当队列为空你却去get的时候,会引发异常。在block为True的情况下可以再设置timeout参数。表示当队列为空,get阻塞timeout指定的秒数之后还没有get到的话就引发Full异常。 |
Queue.put(…[,block[,timeout]]) | 向队尾插入一个item,同样若block=True的话队列满时就阻塞等待有空位出来再put,block=False时引发异常。同get的timeout,put的timeout是在block为True的时候进行超时设置的参数。 |
Queue.task_done() | 从场景上来说,处理完一个get出来的item之后,调用task_done将向队列发出一个信号,表示本任务已经完成。 |
Queue.join() | 监视所有item并阻塞主线程,直到所有item都调用了task_done之后主线程才继续向下执行。这么做的好处在于,假如一个线程开始处理最后一个任务,它从任务队列中拿走最后一个任务,此时任务队列就空了但最后那个线程还没处理完。当调用了join之后,主线程就不会因为队列空了而擅自结束,而是等待最后那个线程处理完成了。 |
生产者与消费者
import threading
from queue import Queue
import time
que = Queue(5)
l =[]
class Producter(threading.Thread):
def run(self):
global l,que
while True:
try:
v = l.pop(0)
que.put(v)
except IndexError:
print("{} exit".format(threading.current_thread()))
break
class Consumer(threading.Thread):
def run(self):
global que
while True:
if que.not_empty:
v = que.get()
time.sleep(0.5)
que.task_done()
print("{} begining {}".format(threading.current_thread(),v))
else:
print("{} exit".format(threading.current_thread()))
break
def main():
global que
p = Producter(name="生产者1")
p.setDaemon(True)
p.start()
for i in range(3):
c = Consumer(name="消费者{}".format(i))
c.setDaemon(True)# 设置为守护进程,主线程退出时,子进程也kill掉
c.start()
que.join()
if __name__ == '__main__':
for i in range(20):
l.append("music {}".format(i))
main()