queue队列模块

1 基本理解

  Queue是一个在内存中,元素带顺序的容器。

  解耦:数据待处理线程把数据交给队列,不需要关心处理者是谁。处理者从队列中拿数据处理,不和待处理线程接触。

  效率:数据待处理线程把数据交给队列,然后继续自己的工作。处理者可以多线程并发处理。

  和列表的区别:队列中的数据取出就会消失。列表不会。

  队列中的元素,处理顺序有三种,先入先出,后入先出,优先级。

 

2 class queue.Queue() 

first in first out

import  queue

q = queue.Queue()
q.put('d1')
q.put('d2')
print(q.qsize())
q.get()
q.get()
q.get(block=True,timeout=4)
>>
2
    raise Empty
queue.Empty
#创建队列实例,put两个数据,获取列队长度,get数据。
#get方法默认阻塞,超时为None,qsize为0时持续阻塞。
#get不到数据,超时后,抛出一个队列空的异常

 

import  queue
q = queue.Queue(maxsize=5)
q.put('d1',timeout=4)
q.put('d1',timeout=4)
q.put('d1',timeout=4)
q.put('d1',timeout=4)
q.put('d1',timeout=4)

q.put('d1',timeout=4)
>>
    raise Full
queue.Full
#创建队列实例时设定了size,然后put方法中设定了timeout,size满了,put超时,就抛出队列满的异常

  

3 class queue.LifoQueue

last in first out

import  queue

q = queue.LifoQueue()
q.put('d1')
q.put('d2')
print(q.qsize())
print(q.get())
print(q.get())
>>
2
d2
d1

  

4 queue.PriorityQueue()

。。。

 

5 生产消费者模型

import  queue,threading,time

q = queue.Queue(maxsize=100)

def producer(name,speed):
    count = 0
    while True:
        count += 1
        q.put('骨头%s' %(count))
        print('\33[42m现在的骨头数 %s,生产者为%s\33[0m' %(q.qsize(),name))
        time.sleep(speed)

def customer(name,speed):
    while True:
        print('%s 消费 %s,正在吃...' %(name,q.get()))
        time.sleep(speed)

jabbok = threading.Thread(target=producer,args=('jabbok',2.5,))
eric = threading.Thread(target=producer,args=('eric',1.5,))
vici = threading.Thread(target=customer,args=('vici',2,))
lee = threading.Thread(target=customer,args=('lee',3,))
jabbok.start()
eric.start()
vici.start()
lee.start()
#jabbok和eric为生产者,jabbok每2.5秒生产一块骨头,eric每1.5秒生产一块骨头
#vici和lee为消费者,vici每2s吃一块骨头,lee每3s吃一块骨头
#生产者生产的骨头放入队列,队列最多放100块骨头。消费者从队列买骨头。实现解耦。

  

 

posted @ 2018-05-29 14:35  jabbok  阅读(274)  评论(1编辑  收藏  举报