这里的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()