Python中的生产者消费者模型

本文通过模拟包子铺营业过程,介绍生产者/消费者模型的基本概念及其实现方式。使用Python编程语言,通过生产者生成包子(数据)并放入缓冲区,消费者从缓冲区取出包子进行消费,展示了一个简单的生产者消费者模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引述:

代码的某个模块负责生产数据(供货商),而生产出来的
数据却不得不交给另一模块(消费者)来对其进行处理,
在这之间我们必须要有一个类似上述超市的东西来存储数据(超市),
这就抽象除了我们的生产者/消费者模型。 
产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者;
生产者和消费者之间的中介就叫做缓冲区。

这里写图片描述

建立一个模拟包子铺营业的程序:

import random
import time

#缓冲区,存放生产的所有包子,工作方式是队列的工作方式(FIFO(先进先出))
cacheList = []
#如果缓冲区列表的长度为5,缓冲区九满了,生产者不能再生产了
chcheListLen = 5 ====== >  len(cachelist)

def isFull():
    #缓冲区满了
    return len(cacheList) == 5

def consumer(name):
    "消费者"
    print("%s准备购买包子....." %(name))
    while True:
        kind = yield
        print("%s购买%s包子成功..." %(name,kind))

def producer(name):
    print("%s厨师正在生产包子....." %(name))
    kinds = ['香菇青菜','牛肉粉条','鸡蛋韭菜','酸菜猪肉']
    while True:
        if not isFull():
                #模拟生产数据耗费时间
            time.sleep(random.random())
            kind = random.choice(kinds)
            print("%s已经准备好了%s包子......" %(name,kind))
            cacheList.append(kind)
        else :
            print("已经有足够的包子了")
            yield
p = producer('villa')
next(p)
consumers = [consumer('user'+str(i)) for i in range(10)]
for i in consumers:
    if not cacheList:
        print("目前没有包子")
    else:
        #如果缓冲区没有满,就让生产者继续生产包子,从上次停止的地方继续执行
        if not isFull():
            next(p)
        #从缓冲区拿出包子给消费者
        for i in range(random.randint(1,4)):
            kind = cacheList.pop()
            next(i)
            i.send(kind)

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值