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生产者消费者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在pycharm中显示python画的图方法

    在pycharm中显示python画的图方法

    今天小编就为大家分享一篇在pycharm中显示python画的图方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 解决python 打包成exe太大的问题

    解决python 打包成exe太大的问题

    这篇文章主要介绍了解决python 打包成exe太大的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python实现按键精灵版的连点器

    Python实现按键精灵版的连点器

    这篇文章主要为大家详细介绍了如何利用Python实现按键精灵版的连点器,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Python接口测试结果集实现封装比较

    Python接口测试结果集实现封装比较

    这篇文章主要介绍了Python接口测试结果集比较封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python 网页解析HTMLParse的实例详解

    Python 网页解析HTMLParse的实例详解

    这篇文章主要介绍了Python 网页解析HTMLParse的实例详解的相关资料,python里提供了一个简单的解析模块HTMLParser类,使用起来也是比较简单的,解析语法没有用到XPath类似的简洁模式,需要的朋友可以参考下
    2017-08-08
  • Python变量基础知识

    Python变量基础知识

    这篇文章主要介绍Python变量的基础知识,围绕Python变量相关知识点展开,需要的朋友可以参考下面文章的具体内容
    2021-10-10
  • python将图片转为矢量图的方法步骤

    python将图片转为矢量图的方法步骤

    这篇文章主要介绍了python将图片转为矢量图的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python数据清洗系列之字符串处理详解

    python数据清洗系列之字符串处理详解

    这篇文章主要介绍了python数据清洗之字符串处理的相关资料,需要的朋友可以参考下
    2017-02-02
  • Python中导入自定义模块的几种方法总结

    Python中导入自定义模块的几种方法总结

    这篇文章主要介绍了Python中导入自定义模块的几种方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 分享一下Python数据分析常用的8款工具

    分享一下Python数据分析常用的8款工具

    Python是数据处理常用工具,可以处理数量级从几K至几T不等的数据,具有较高的开发效率和可维护性,还具有较强的通用性和跨平台性,这里就为大家分享几个不错的数据分析工具,需要的朋友可以参考下
    2018-04-04

最新评论