python中的生产者与消费者模式

来源:互联网 发布:钢雨篷荷载计算软件 编辑:程序博客网 时间:2024/06/06 05:05

Queue的说明

 

  1. 对于Queue,在多线程通信之间扮演重要的角色
  2. 添加数据到队列中,使用put()方法
  3. 从队列中取数据,使用get()方法
  4. 判断队列中是否还有数据,使用qsize()方法

 

生产者消费者模式的说明

 

为什么要使用生产者和消费者模式

 

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

 

什么是生产者消费者模式

 

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

 

这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三者出来进行解耦。

 

例如:

from threading import Thread

import queue

 

importtime

 

q = queue.Queue() #创建一个队列容器,用来保存生产者产生的数据

 

 

classProducer(Thread):

   """生产者线程"""

    def run(self):

        count = 0

        while True:

            if q.qsize() < 50:

                for i in range(3):

                    count += 1

                    msg = "产品 %d" % count

                    q.put(msg)

                    print("生产者%s生产了一个数据 %s" % (self.name, msg))

            time.sleep(1)

 

 

classCustomer(Thread):

   """消费者线程"""

    def run(self):

        while True:

            if q.qsize() > 20:

                for i in range(2):

                    msg = q.get()

                    print("消费者%s消费了一个数据 %s" % (self.name, msg))

            time.sleep(1)

 

 

fori in range(3):

    p = Producer()

    p.start()

 

fori in range(5):

    c = Customer()

    c.start()

 

原创粉丝点击