python 的生产者和消费者模式

作者:季布, 时间:2021-09-18 07:19:45 

目录
  • python 的生产者和消费者模式

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

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

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

    • 四、代码案例

      • 1、定义一个生产者

      • 2、定义一个消费者

      • 3、定义一个队列

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个主要作用

  • 程序的解耦合

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

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

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

猜你喜欢

  • XMLHTTP错误The server name or address could not be resolved 的解决过程

    2009-12-26 18:33:00
  • 提高MYSQL查询效率的三个有效的尝试

    2009-02-27 16:08:00
  • Python类中的装饰器在当前类中的声明与调用详解

    2021-03-07 10:29:35
  • Oracle数据泵的导入与导出实例详解

    2024-01-17 00:10:09
  • python 包之 re 正则匹配教程分享

    2021-10-15 18:36:41
  • SQLServer 附加数据库后出现只读或失败的解决方法

    2024-01-18 11:29:23
  • python argparse模块通过后台传递参数实例

    2021-05-08 04:13:17
  • 关于Django显示时间你应该知道的一些问题

    2023-10-23 06:26:21
  • Python中偏函数用法示例

    2022-10-13 18:48:26
  • Python中字符串格式化str.format的详细介绍

    2021-08-19 01:28:37
  • 推荐Python小白理想的IDE编辑器thonny

    2021-06-15 02:53:39
  • Python用61行代码实现图片像素化的示例代码

    2021-08-27 13:10:55
  • 对SQL Server聚集索引的指示综合描述

    2010-08-31 14:25:00
  • python多线程爬取西刺代理的示例代码

    2021-05-27 04:32:57
  • python简单区块链模拟详解

    2023-11-09 12:04:57
  • Go语言的互斥锁的详细使用

    2024-03-11 04:04:30
  • Javascript: 为<input>设置readOnly属性问题,希望大家以后要小心

    2009-07-23 20:24:00
  • Python批量修改文件名实例操作分享

    2022-04-11 06:14:47
  • MySQL性能优化的一些技巧帮助你的数据库

    2024-01-20 12:44:22
  • python的pstuil模块使用方法总结

    2022-10-09 22:47:16
  • asp之家 网络编程 m.aspxhome.com