这里的Queue指的是线程中的Queue,后面还有进程间的Queue
基本FIFO队列:先进先出。
calss Queue.Queue(maxsize=0)
maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。
#coding:utf-8 import Queue q=Queue.Queue(5) #队列中只能存放5个数据 for i in range(5): q.put(i) while not q.empty(): print q.get()
LIFO队列:后进先出
class Queue.LifoQueue(maxsize=0)
#coding:utf-8 import Queue q=Queue.LifoQueue(5) #队列中只能存放5个数据 for i in range(5): q.put(i) while not q.empty(): print q.get()
结果:
4
3
2
1
0
优先级队列
class Queue.PriorityQueue(maxsize=0)
#coding:utf-8 import Queue import threading class Job(object): def __init__(self, priority, description): self.priority = priority self.description = description print 'Job:',description return def __cmp__(self, other): return cmp(self.priority, other.priority) q = Queue.PriorityQueue() q.put(Job(3, 'level 3 job')) q.put(Job(10, 'level 10 job')) q.put(Job(1, 'level 1 job')) def process_job(q): while True: next_job = q.get() print 'for:', next_job.description q.task_done() #告诉队列该任务已经处理完毕 workers = [threading.Thread(target=process_job, args=(q,)), threading.Thread(target=process_job, args=(q,)) ] for w in workers: w.setDaemon(True) #将主线程设置为守护进程 w.start() q.join()
常用方法:
# 先入先出 maxsize 可设置大小,设置block=False抛异常 class queue.Queue(maxsize=0) # 后进先出 class queue.LifoQueue(maxsize=0) # 存储数据时可设置优先级的队列 # 优先级设置数越小等级越高 class queue.PriorityQueue(maxsize=0) # 放入数据 Queue.put(item, block=True, timeout=None) # 取出数据 #没有数据将会等待 Queue.get(block=True, timeout=None) # 如果1秒后没取到数据就退出 Queue.get(timeout = 1) # 取数据,如果没数据抛queue.Empty异常 Queue.get_nowait() # 查看队列大小 Queue.qsize() # 返回True,如果空 Queue.empty() #return True if empty # 设置队列大小 Queue.full() # 后续调用告诉队列,任务的处理是完整的。 Queue.task_done()
生产者消费者模型
#coding:utf-8 import threading,time import queue q = queue.Queue(maxsize=10) #定义队列对象 def Producer(name): count = 1 while True: q.put("gu%s" % count) #放入队列 print("shenggu",count) count +=1 time.sleep(1) def Consumer(name): #while q.qsize()>0: while True: print("[%s] 取到[%s] 并且吃了它..." %(name, q.get())) #从队列中取出 time.sleep(1) p = threading.Thread(target=Producer,args=("小张",)) c = threading.Thread(target=Consumer,args=("小王",)) c1 = threading.Thread(target=Consumer,args=("小李",)) p.start() c.start() c1.start()