Python线程(三)之生成者消费者模式

0人阅读 评论(0) 收藏 举报
分类:
  • 为什么要使用生产者和消费者模式
    在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
    大多在消息中间件中有使用
  • 什么是生产者消费者模式
    生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

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

#encoding=utf-8
import threading
import time

#python2中
from Queue import Queue

#python3中
# from queue import Queue

class Producer(threading.Thread):
    def run(self):
        global queue
        count = 0
        while True:
            if queue.qsize() < 1000:
                for i in range(100):
                    count = count +1
                    msg = '生成产品'+str(count)
                    queue.put(msg)
                    print(msg)
            time.sleep(0.5)

class Consumer(threading.Thread):
    def run(self):
        global queue
        while True:
            if queue.qsize() > 100:
                for i in range(3):
                    msg = self.name + '消费了 '+queue.get()
                    print(msg)
            time.sleep(1)


if __name__ == '__main__':
    queue = Queue()

    for i in range(500):
        queue.put('初始产品'+str(i))
    for i in range(2):
        p = Producer()
        p.start()
    for i in range(5):
        c = Consumer()
        c.start()
查看评论

设计模式之生成者与消费者模式

1、生产者与消费者模式 多线程中,生成者与消费者是一个很典型的例子。生产者就是生产数据的线程,消费者就是消费数据的线程。生产者与消费者模式是通过一个共享资源缓冲区来解决生产者和消费者的强耦合问题...
  • CHINACR07
  • CHINACR07
  • 2017-12-17 15:20:42
  • 135

多线程实现生产者与消费者模式

生产者-消费者模式的简介:在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者。但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介,生...
  • qq_33951180
  • qq_33951180
  • 2017-06-01 10:08:07
  • 1025

python生产者/消费者示例

Python多线程实现生产者/消费者模式。
  • dutsoft
  • dutsoft
  • 2017-01-24 23:10:26
  • 1030

Java多线程编程核心技术——生产者消费者模型

生产者消费者模型是并发中的经典问题,具体场景是有一块缓冲区作为仓库,生产者可以向其添加产品,消费者可以从中取出产品。解决生产者消费者问题可以采用两种方式:wait()/notify方式和Blockin...
  • ghz_blog
  • ghz_blog
  • 2017-02-28 10:46:00
  • 962

java多线程学习生产者消费者

上一篇博客主要学习了线程安全问题,以及简单的线程等待唤醒机制。这篇博客,基于上一篇的基础之上学习”生产者和消费者”,如果我有这样一个需求,即没生产一个商品就将其消费掉。 资源类先看下Resource....
  • mockingbirds
  • mockingbirds
  • 2015-08-22 15:42:28
  • 1000

Java多线程--生产者消费者模型(Semaphore实现)

需求要求:使用2个线程,分别代表:生产者、消费者。让他们并发的去生产、消费产品。生产的总数是不能超过N的。实现思路这里我们使用的是使用信号量去控制线程的生产消费,通过释放令牌的形式去控制生产者消费者的...
  • qq_24489717
  • qq_24489717
  • 2017-04-12 21:53:01
  • 1186

c++多线程实现生产者消费者

生产和消费思路: 生产时先扫描一遍buffer找到第一个为0(即没有产品)的位置,生产一个产品,并把产品编号(从1到10循环)存在这里。 消费时先扫描一遍buffer找到第一个不为1(即有产品)的...
  • tingyuanss
  • tingyuanss
  • 2013-04-21 21:54:31
  • 7791

生产者--消费者模式,理解多线程并发

解决生产者消费者的最有效的方式是阻塞队列 举个例子就是一个负责吃,一个负责造,东西放在一张桌子上。 生产者准备食物,如果桌子上已经满了就等待,生产者等待。如果桌子空了的话,消费者等待。这里桌子就是一个...
  • Stone_OverLooking
  • Stone_OverLooking
  • 2017-05-22 16:01:30
  • 145

网络爬虫:分离生产者和消费者来优化爬虫程序

基于前面的一些工作(可参见笔者前面的相关博客),我们取得了一些成果。不过存在的问题又总是会让人坐立不安。本文通过分离生产者、消费者以及引入连接池技术来优化爬虫程序。解决前面说到的数据库连接数过大、程序...
  • u013761665
  • u013761665
  • 2015-08-21 16:52:34
  • 3837

Qt之线程同步(生产者消费者模式 - QSemaphore)

简述生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据。消费者线程读取数据并将其写入标准错误。Semaphores 使得比 mutexes 有一个更高级的并发性成...
  • u011012932
  • u011012932
  • 2016-09-23 16:33:38
  • 4674
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1403
    排名: 3万+