python 队列Queue

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

 

posted @ 2018-07-17 22:08  python|一路向前  阅读(257)  评论(0编辑  收藏  举报