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

作者:季布, 时间:2021-03-07 17:55:53 

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

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

什么是生产者消费者模式

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

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生产者消费者模式的资料请关注脚本之家其它相关文章!

来源:https://blog.csdn.net/weixin_47906106/article/details/120112532

标签:Python,生产者,消费者
0
投稿

猜你喜欢

  • 详解基于pycharm的requests库使用教程

    2023-08-12 09:40:39
  • 教你在SQL Server 2000数据库中使用分区

    2008-11-25 11:55:00
  • Python中使用Inotify监控文件实例

    2021-03-03 14:17:05
  • 基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    2023-06-16 12:11:26
  • MySQL安全性指南 (1)(转)

    2010-07-27 12:49:00
  • 将mater库中的系统存储过程批量生成*.sql文件 通用且非常实用

    2012-06-06 20:03:43
  • python怎么判断素数

    2021-09-30 11:10:33
  • JS中getElementsByClassName与classList兼容性问题解决方案分析

    2023-08-25 05:39:06
  • Python3.6使用tesseract-ocr的正确方法

    2023-10-24 20:46:28
  • Django 项目重命名的实现步骤解析

    2021-01-13 14:05:49
  • PHP结构型模式之代理模式

    2023-05-25 06:55:34
  • Array.prototype.slice

    2010-05-07 12:43:00
  • 细化解析:MySQL 搜索中的大小写敏感性

    2008-11-27 15:53:00
  • Dreamweaver定义本地站点

    2010-07-02 16:27:00
  • 如何用CSS实现图像替换链接文本显示并保证链接可点击

    2011-03-03 12:37:00
  • 想学python 这5本书籍你必看!

    2023-11-20 07:41:46
  • CSS Hack经验总结

    2008-05-01 13:13:00
  • python同义词替换的实现(jieba分词)

    2022-02-10 20:58:00
  • Python异常处理如何才能写得优雅(retrying模块)

    2023-07-13 05:50:44
  • Django模板之基本的 for 循环 和 List内容的显示方式

    2021-09-24 05:18:24
  • asp之家 网络编程 m.aspxhome.com