生产者消费者模型

简介

在线程中,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,由于生产者和消费者处理速度的差异,就会产生等待,造成时间浪费。

生产者消费者模式通过一个容器解决了生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而是通过阻塞队列通讯。生产者生产完之后直接丢给阻塞队列,而不必等待消费者;消费者反之同理。阻塞队列相当于一个缓冲区,平衡了生产者和消费者的处理能力。

在这里插入图片描述


生产者消费者示例1

'''
@file: producer_consumer_1.py
@author: zyh
@time: 2023/5/10 10:00

生产者消费者模型实例1。
'''
import time
import random
import queue
import threading

q = queue.Queue()   # FIFO

def producer(name):
    count = 1
    while count < 5:
        print('cooking...')
        time.sleep(1)
        q.put(count)
        print('\033[1;31mproducer {} has cooked {} hamburgers.\033[0m'.format(name, count))
        count += 1
        print('DONE!')
        
def consumer(name):
    count = 0
    while count < 5:
        time.sleep(1)
        if not q.empty():
            data = q.get()
            print('\033[32;1mConsumer {} has eaten {} hamburger...\033[0m'.format(name, data))
        else:
            print('No Humburger Anymore')
        count += 1
        
p1 = threading.Thread(target=producer, args='A')

c1 = threading.Thread(target=consumer, args='B')
c2 = threading.Thread(target=consumer, args='C')

p1.start()
c1.start()
c2.start()

Python如何控制终端的字符颜色?
书写格式:print('\033[文字效果;前景色;背景色m文字内容\033[0m')
【注】三个参数为可选参数,至少写一个,参数书写没有顺序
在这里插入图片描述

参数值说明

e.g. print('\033[32;1mConsumer {} has eaten {} hamburger...\033[0m'.format(name, data))


更多内容参考Python终端打印彩色字符


生产者消费者示例2

在一些场景下,需要生产者生产完产品后通知消费者,消费者得到通知再做自己的事。

'''
@file: producer_consumer_2.py
@author: zyh
@time: 2023/5/10 11:10

生产者消费者模型实例2。
'''
import time
import random
import threading
import queue

q = queue.Queue()

def producer(name):
    count = 0
    while count < 10:
        print('cooking...')
        time.sleep(1)
        q.put(count)
        print('\033[1;31mProducer {} has cooked No.{} hamburgers.\033[0m'.format(name, count))
        count += 1
        q.task_done()
        print('DONE!')
        

def consumer(name):
    count = 1
    while count < 10:
        q.join()
        data = q.get()
        print('\033[1;32mConsumer {} has eaten No.{} hamburger.\033[0m'.format(name, data))
        count += 1

p = threading.Thread(target=producer, args='A')

c1 = threading.Thread(target=consumer, args='B')
c2 = threading.Thread(target=consumer, args='C')

p.start()
c1.start()
c2.start()

输出:

cooking...
Producer A has cooked No.0 hamburger.
DONE!Consumer B has eaten No.0 hamburger.

cooking...
Producer A has cooked No.1 hamburger.
DONE!Consumer C has eaten No.1 hamburger.

cooking...
Producer A has cooked No.2 hamburger.
DONE!Consumer B has eaten No.2 hamburger.

cooking...
Producer A has cooked No.3 hamburger.
DONE!
Consumer C has eaten No.3 hamburger.cooking...

Producer A has cooked No.4 hamburger.
DONE!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值