python关于多线程的关系 实例

本文通过Python的多线程编程实现了一个蒸包子与吃包子的过程模拟。伙夫负责蒸包子并唤醒等待的吃货们,而吃货们则在包子蒸好后依次取食直至蒸笼为空,之后再次唤醒伙夫蒸制新的包子。该模拟展示了如何使用条件变量(Condition)来协调不同线程间的同步操作。

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

import threading,time
zhenglong=[]  #共享数据的蒸笼
#创建两把锁 一把蒸馒头的锁 由伙夫掌管
#另外一把吃馒头的锁 由吃货掌管
zheng_lock=threading.Lock()
zheng_Cond=threading.Condition(lock=zheng_lock)
chi_lock=threading.Lock()
chi_Cond=threading.Condition(lock=chi_lock)

class huofu(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.setName(name)
    def run(self):
        while True:
            chi_Cond.acquire()#被唤醒
            if len(zhenglong)==0:
                #开始正包子
                for i in range(1,11):
                    zhenglong.append(i)
                    time.sleep(0.1)
                    print('正在蒸第{0}个包子'.format(i))
                print('包子蒸完了  唤醒吃货们开始吃包子...')
                chi_Cond.notify_all()
            chi_Cond.release()#唤醒了伙夫 他就释放
            #伙夫进入休眠
            zheng_Cond.acquire()
            zheng_Cond.wait()
            zheng_Cond.release()

class chihuo(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.setName(name)
    def run(self):
        while True:
            chi_Cond.acquire()#同一个时刻只有一个吃货在获取吃包子的资源
            global zhenglong
            if len(zhenglong)==0:
    #开始呼唤伙夫 只叫一次 蒸包子 吃货们开始休眠
                zheng_Cond.acquire()#锁定叫醒伙夫的线程
                zheng_Cond.notify()#唤醒
                zheng_Cond.release()#释放
                chi_Cond.wait()#吃货休眠
            else:
                baozi=zhenglong.pop()
                print('{0}吃了第{1}个包子 剩余{2}个包子'.format(self.getName(),baozi,len(zhenglong)))
                time.sleep(0.1)
            chi_Cond.release()
W=huofu('伙夫')
xiaogang=chihuo('小刚')
xiaoming=chihuo('小明')
xiaohong=chihuo('小红')

W.start()
xiaogang.start()
xiaoming.start()
xiaohong.start()

结果为

正在蒸第1个包子
正在蒸第2个包子
正在蒸第3个包子
正在蒸第4个包子
正在蒸第5个包子
正在蒸第6个包子
正在蒸第7个包子
正在蒸第8个包子
正在蒸第9个包子
正在蒸第10个包子
包子蒸完了  唤醒吃货们开始吃包子...
小刚吃了第10个包子 剩余9个包子
小明吃了第9个包子 剩余8个包子
小明吃了第8个包子 剩余7个包子
小明吃了第7个包子 剩余6个包子
小明吃了第6个包子 剩余5个包子
小刚吃了第5个包子 剩余4个包子
小刚吃了第4个包子 剩余3个包子
小刚吃了第3个包子 剩余2个包子
小刚吃了第2个包子 剩余1个包子
小刚吃了第1个包子 剩余0个包子
正在蒸第1个包子
正在蒸第2个包子
正在蒸第3个包子
正在蒸第4个包子
正在蒸第5个包子
正在蒸第6个包子
正在蒸第7个包子
正在蒸第8个包子
正在蒸第9个包子
正在蒸第10个包子
包子蒸完了  唤醒吃货们开始吃包子...
小红吃了第10个包子 剩余9个包子
小刚吃了第9个包子 剩余8个包子
小明吃了第8个包子 剩余7个包子
小明吃了第7个包子 剩余6个包子
小明吃了第6个包子 剩余5个包子
小明吃了第5个包子 剩余4个包子
小明吃了第4个包子 剩余3个包子
小刚吃了第3个包子 剩余2个包子
小刚吃了第2个包子 剩余1个包子
小刚吃了第1个包子 剩余0个包子
正在蒸第1个包子
正在蒸第2个包子
正在蒸第3个包子
正在蒸第4个包子
正在蒸第5个包子
正在蒸第6个包子
正在蒸第7个包子
正在蒸第8个包子
正在蒸第9个包子
正在蒸第10个包子
包子蒸完了  唤醒吃货们开始吃包子...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值