Python教程之生产者消费者模式解析

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

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

什么是生产者消费者模式

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

代码案例

import threading
import queue
import time
#定义一个生产者
def producer():
    count = 0
    #判断队列中任务的数量
    while q.qsize()<5:
        print('第%s顿饭......',count)
        q.put(count)
        count+=1
        time.sleep(1)
#定义一个消费者
def consumer(name):
    while True:
        print("%s 吃了第%s饭" % (name,q.get()))
#定义一个队列
q = queue.Queue(maxsize=4)
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer,args=('jibu',))
t1.start()
t2.start()

结果:
第%s顿饭...... 0
jibu 吃了第0饭
第%s顿饭...... 1
jibu 吃了第1饭
第%s顿饭...... 2
jibu 吃了第2饭
第%s顿饭...... 3
jibu 吃了第3饭
第%s顿饭...... 4
jibu 吃了第4饭
第%s顿饭...... 5
jibu 吃了第5饭
第%s顿饭...... 6
jibu 吃了第6饭
第%s顿饭...... 7
jibu 吃了第7饭
第%s顿饭...... 8
# 另外,如果供大于求或者求大于供,可以在相对小的一方在增加线程的数量

当然如果需要进一步优化可以让消费者执行完队列中所有任务的时候告诉生产者一声

import threading
import queue
import time
#定义一个生产者
def producer():
    count = 0
    #判断队列中任务的数量
    for i in range(5):
        print('第%s顿饭......',count)
        q.put(count)
        count+=1
        time.sleep(1)
    q.join()
#定义一个消费者
def consumer(name):
    while True:
        print("%s 吃了第%s饭" % (name,q.get()))
        q.task_done()
        print('消费者执行完了所有任务')
#定义一个队列
q = queue.Queue(maxsize=4)
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer,args=('jibu',))
t1.start()
t2.start()

结果
第0顿饭......
jibu 吃了第0饭
消费者执行完了所有任务
第1顿饭......
jibu 吃了第1饭
消费者执行完了所有任务
第2顿饭......
jibu 吃了第2饭
消费者执行完了所有任务
第3顿饭......
jibu 吃了第3饭
消费者执行完了所有任务
第4顿饭......
jibu 吃了第4饭
消费者执行完了所有任务

结论:

生产者消费者的2个主要作用
1.程序的解耦合
2.程序的异步执行,提高了程序的运行效率(在排队的时候可以做别的事,过一会可以回来拿这个结果)

以上就是Python教程之生产者消费者模式解析的详细内容,更多关于Python生产者消费者模式的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python semaphore evevt生产者消费者模型原理解析

    线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量 import threading, time, queue def test(name): semaphore.acquire() #获取信号量锁 print('my name is %s' %name) time.sleep(1) semaphore.release() #释放信号量锁 semaphore = threading.BoundedSemaphore(

  • python条件变量之生产者与消费者操作实例分析

    本文实例讲述了python条件变量之生产者与消费者操作.分享给大家供大家参考,具体如下: 互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Python还提供了Condition对象.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件.如果条件不满足则wait:如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到

  • 用Python的线程来解决生产者消费问题的示例

    我们将使用Python线程来解决Python中的生产者-消费者问题.这个问题完全不像他们在学校中说的那么难. 如果你对生产者-消费者问题有了解,看这篇博客会更有意义. 为什么要关心生产者-消费者问题: 可以帮你更好地理解并发和不同概念的并发. 信息队列中的实现中,一定程度上使用了生产者-消费者问题的概念,而你某些时候必然会用到消息队列. 当我们在使用线程时,你可以学习以下的线程概念: Condition:线程中的条件. wait():在条件实例中可用的wait(). notify() :在条件实

  • Python自定义进程池实例分析【生产者、消费者模型问题】

    本文实例分析了Python自定义进程池.分享给大家供大家参考,具体如下: 代码说明一切: #encoding=utf-8 #author: walker #date: 2014-05-21 #function: 自定义进程池遍历目录下文件 from multiprocessing import Process, Queue, Lock import time, os #消费者 class Consumer(Process): def __init__(self, queue, ioLock):

  • Python教程之生产者消费者模式解析

    为什么使用生产者消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题引入了生产者和消费者模式. 什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用通

  • 详解Python 模拟实现生产者消费者模式的实例

    详解Python 模拟实现生产者消费者模式的实例 散仙使用python3.4模拟实现的一个生产者与消费者的例子,用到的知识有线程,队列,循环等,源码如下: Python代码 import queue import time import threading import random q=queue.Queue(5) #生产者 def pr(): name=threading.current_thread().getName() print(name+"线程启动......") for

  • Python教程之生产者消费模式解析

    为什么使用生产者消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题引入了生产者和消费者模式. 什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用通

  • Java生产者消费者模式实例分析

    本文实例讲述了Java生产者消费者模式.分享给大家供大家参考,具体如下: java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存. 这么做有什么好处呢? 1.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费者的代码也需要随之变动 2.高效,如果消费者直接掉生产者,执行时间较长的话,会阻塞,影响其他业务的进行 3.负载均衡,如果消费者直接调生产者,那生产者和消费者就得在一起了,日后业务量非常大的话,要想减轻服务器的压力,想拆分生产和消费,就很困

  • java wait()/notify() 实现生产者消费者模式详解

    java wait()/notify() 实现生产者消费者模式 java中的多线程会涉及到线程间通信,常见的线程通信方式,例如共享变量.管道流等,这里我们要实现生产者消费者模式,也需要涉及到线程通信,不过这里我们用到了java中的wait().notify()方法: wait():进入临界区的线程在运行到一部分后,发现进行后面的任务所需的资源还没有准备充分,所以调用wait()方法,让线程阻塞,等待资源,同时释放临界区的锁,此时线程的状态也从RUNNABLE状态变为WAITING状态: noti

  • Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

    前言 前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作.大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变量做tickets–操作,这就是大名鼎鼎的生产者和消费者模式. 正文 一,生产者-消费者模式也是多线程 生产者和消费者模式也是多线程的范例.所以其编程需要遵循多线程的规矩. 首先,既然是多线程,就必然要使用同步.上回说到,synchronized关键字在修饰函数的时候,使用的是"this"

  • Lock、Condition实现简单的生产者消费者模式示例

    复制代码 代码如下: package condition; import java.util.ArrayList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * 利用Lock.Condition实现生产者消费者模式 * @aut

  • 基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相同的,这体现的是一种线程间通信方式. 本文将先说明单生产者单消费者的情况,之后再说明多生产者多消费者模式的情况.还会分别使用wait()/nofity()/nofityAll()机制.lock()/unlock()机制实现这两种模式. 在开始介绍模式之前,先解释下wait().notify()和no

  • Java多线程之生产者消费者模式详解

    目录 1.生产者消费者模型 2.实现生产者消费者模型 3.生产者消费者模型的作用是什么? 总结 问题: 1.什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型? 2. 生产者消费者模型的作用是什么? 1. 生产者消费者模型 在生产者-消费者模式中,通常有两类线程,即生产者线程(若干个)和消费者线程(若干个).生产者线程向消息队列加入数据,消费者线程则从消息队列消耗数据.生产者和消费者.消息队列之间的关系结构图如图: (1) 消息队列可以用来平衡生产和消费的线程资源: (2) 生产者仅负责产

随机推荐