python第九天(9-34)

一:队列的三种模式

先进先出(FIFO)

    • class queue.Queue(maxsize)
  • 后进先出(LIFO)
    • class queue.LifoQueue(maxsize)
  • 优先级顺序(优先级低的先进先出)
    • class queue.PriorityQueue(maxsize)

二:队列的方法

  • parad=queue.Queue(4) -----------生成一个队列的对象,最多能存5个数据
  • parad.put(item,block=True,timeout=False )------------放入一个数据
    • block参数:block为True且队列已满,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为false,put方法将引发Full异常
    parad.get(self,block=True,timeount=False)---------取出一个数据                
    • block参数:如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将Empty异常
  • parad.qsize() 返回队列的实际大小
  • parad.empty() 如果队列为空,返回True,反之False
  • parad.full() 如果队列满了,返回True,反之False

 一:什么是生产者与消费者模型

  生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力

二:理解强耦合

  所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为(这就是解耦)。但是,这个共享数据区域中应该具备这样的线程间并发协作的功能:
链接:https://www.jianshu.com/p/e29632593057
三:生产者与消费者实例

 

 1 import time,random
 2 import queue,threading
 3 
 4 q = queue.Queue()#生成一个队列对象
 5 
 6 def Producer(name):
 7   count = 0
 8   while count <10:
 9     print("making........")
10     time.sleep(2)
11     q.put(count)
12     print('Producer %s has produced %s baozi..' % (name, count))
13     time.sleep(5)#这里的sleep是为了验证,q.join()会等待q.task()发过去信号才会执行,在这之前会一直阻塞
14     q.task_done()
15     count +=1
16     #q.join()
17     print("ok......")
18 def Consumer(name):
19     count = 0
20     while count <10:
21         time.sleep(3)
22         q.join()
23         data = q.get()
24         #q.task_done()
25         # #q.join()
26         print("data",data)
27         print('\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data))
28     else:
29         print("-----no baozi anymore----")
30     count += 1
31 
32 
33 
34 p1 = threading.Thread(target=Producer, args=('A',))
35 c1 = threading.Thread(target=Consumer, args=('B',))
36 c2 = threading.Thread(target=Consumer, args=('C',))
37 c3 = threading.Thread(target=Consumer, args=('D',))
38 p1.start()
39 c1.start()
40 c2.start()
41 c3.start()

 

posted @ 2019-02-12 10:07  JuiceWoo  阅读(174)  评论(0)    收藏  举报