python 的生产者和消费者模式

 更新时间:2021年09月06日 11:10:37   作者:季布,  
这篇文章主要介绍了python 的生产者和python 的消费者模式的具体相关资料,需要的朋友可以参考下面文章内容

python 的生产者和消费者模式

一、生产者消费者模式概述

在并发编程中使用生产者和消费者模式能够解决大不多的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

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

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

三、什么是生产者消费者模式

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

四、代码案例

1、定义一个生产者

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)

 

2、定义一个消费者

import threading
import queue
import time

#定义一个消费者
def consumer(name):
    while True:
        print("%s 吃了第%s饭" % (name,q.get()))

3、定义一个队列

import threading
import queue
import time

#定义一个队列
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个主要作用

  • 程序的解耦合
  • 程序的异步执行,提高了程序的运行效率(在排队的时候可以做别的事,过一会可以回来拿这个结果)

到此这篇关于python 的生产者和消费者模式的文章就介绍到这了,更多相关python生产者消费者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何在Python中用好短路机制

    如何在Python中用好短路机制

    这篇文章主要介绍了如何在Python中用好短路机制,Python中的短路机制非常有用,跟很多其他编程语言中的短路机制作用类似,接下来让我们通过几个简单的例子总结Python中可用的几种短路机制,需要的朋友可以参考下
    2022-02-02
  • pytorch使用指定GPU训练的实例

    pytorch使用指定GPU训练的实例

    今天小编就为大家分享一篇pytorch使用指定GPU训练的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 分享一下Python 开发者节省时间的10个方法

    分享一下Python 开发者节省时间的10个方法

    在这篇文章,我想强调一些 Python 可以节约时间并最大限度地提高生产力的方面。在做准备时,我咨询了几个 Pythonists,他们最节省时间的技巧是什么?答案在这里
    2015-10-10
  • 用pandas划分数据集实现训练集和测试集

    用pandas划分数据集实现训练集和测试集

    这篇文章主要介绍了用pandas划分数据集实现训练集和测试集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python7个爬虫小案例详解(附源码)下篇

    Python7个爬虫小案例详解(附源码)下篇

    这篇文章主要介绍了Python7个爬虫小案例详解(附源码)上篇,本文章内容详细,通过案例可以更好的理解爬虫的相关知识,七个例子分为了三部分,本次为下篇,共有三道题,需要的朋友可以参考下
    2023-01-01
  • python实现石头剪刀布小游戏

    python实现石头剪刀布小游戏

    这篇文章主要为大家详细介绍了python实现石头剪刀布小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • python实现while循环打印星星的四种形状

    python实现while循环打印星星的四种形状

    今天小编就为大家分享一篇python实现while循环打印星星的四种形状,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python读取和保存视频文件

    python读取和保存视频文件

    这篇文章主要为大家详细介绍了python读取显示和保存视频文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例

    Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例

    这篇文章主要介绍了Python Scrapy框架:通用爬虫之CrawlSpider用法,结合实例形式分析了Scrapy框架中CrawlSpider的基本使用方法,需要的朋友可以参考下
    2020-04-04
  • Python中logger日志模块详解

    Python中logger日志模块详解

    这篇文章主要介绍了Python中logger日志模块详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论