python 多线程主动结束消费者线程

本文通过一个模拟案例展示了Python如何使用多线程实现厨师生产包子和顾客消费包子的过程。厨师和顾客分别由`Chef`和`Customer`类表示,使用线程进行异步操作。在特定情况下,厨师会制造毒包子导致顾客死亡,模拟了线程间的交互和控制。此外,还讨论了如何在多线程环境中控制消费者线程的结束。

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

python 多线程主动结束消费者线程

多线程概念

不作赘述

本文解决问题

python多线程(消费者)退出

上代码
  1. 证物
class Baozi():#包子对象
    def __init__(self,ispoison = False):
        self.name = '我是一个包子'
        self.ispoison = ispoison#是否有毒

2.嫌疑人

class Chef(threading.Thread):#厨师:生产包子
    baoziNumber = 1#统计所有厨师共生产了多少包子
    lock = threading.Lock()#锁

    def __init__(self,name,foodwindow):
        threading.Thread.__init__(self)#初始化父类
        self.name = name
        self.foodwindow = foodwindow

    def run(self):  # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
        self.makeBaozi(10)

    def makeBaozi(self, num):#厨师生产包子

        for i in range(1,num+1):
            baozi = Baozi()
            Chef.lock.acquire()
            print("厨师{}制造了第{}个包子".format(self.name,str(Chef.baoziNumber)))
            Chef.baoziNumber +=1
            self.foodwindow.put(baozi)
            Chef.lock.release()
            time.sleep(1)

    def makeDuBaozi(self, num):#厨师生产毒包子
        for i in range(1,num+1):
            duBaozi = Baozi(ispoison=True)
            print("厨师{}制造了第{}个毒包子".format(self.name,str(i)))
            self.foodwindow.put(duBaozi)

3.受害人

class Customer(threading.Thread):#顾客:消费者
    baoziNumber = 1 #统计所有顾客共吃了多少包子
    lock = threading.Lock()

    def __init__(self,name,foodwindow):
        threading.Thread.__init__(self)
        self.name = name
        self.foodwindow = foodwindow

    def run(self):  # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
        self.eatBaozi()

    def eatBaozi(self):#顾客吃包子

        while True:
            baozi = self.foodwindow.get()
            if not baozi.ispoison:
                Customer.lock.acquire()
                print("顾客{}吃了第{}个包子".format(self.name,str(Customer.baoziNumber)))
                Customer.baoziNumber += 1
                Customer.lock.release()
                time.sleep(0.25)
            else:
                print("顾客{}被毒死了".format(self.name))
                break

4.案发经过

def main():
    foodwindow = Queue(maxsize=10)#生产消费队列
    Chefs = [Chef(name='李四'+str(i), foodwindow=foodwindow) for i in range(1,11)]#所有李四(厨师)
    Customers = [Customer(name='张三'+str(j), foodwindow=foodwindow) for j in range(1,5)]#所有张三(顾客)
    [item.start() for item in Chefs]#所有李四开始制作
    [item.start() for item in Customers]#所有张三开始消费
    [item.join() for item in Chefs]#所有李四制作完毕
    Chefs[0].makeDuBaozi(len(Customers))#李四1投毒

结果

相关案件
  1. 顾客多于厨师
#案发经过
def main():
    foodwindow = Queue(maxsize=10)
    Chefs = [Chef(name='李四'+str(i), foodwindow=foodwindow) for i in range(1,4)]
    Customers = [Customer(name='张三'+str(j), foodwindow=foodwindow) for j in range(1,7)]
    [item.start() for item in Chefs]
    [item.start() for item in Customers]
    [item.join() for item in Chefs]
    Chefs[0].makeDuBaozi(len(Customers))

成功作案
在这里插入图片描述
2. 1顾客1厨师

def main():
    foodwindow = Queue(maxsize=10)
    Chefs = [Chef(name='李四'+str(i), foodwindow=foodwindow) for i in range(1,2)]
    Customers = [Customer(name='张三'+str(j), foodwindow=foodwindow) for j in range(1,2)]
    [item.start() for item in Chefs]
    [item.start() for item in Customers]
    [item.join() for item in Chefs]
    Chefs[0].makeDuBaozi(len(Customers))

成功作案
在这里插入图片描述

1.制裁

def punish(obj):
    time.sleep(1)
    print('犯人{}被制裁'.format(obj.name))
    del obj
def main():
    foodwindow = Queue(maxsize=10)
    Chefs = [Chef(name='李四'+str(i), foodwindow=foodwindow) for i in range(1,2)]
    Customers = [Customer(name='张三'+str(j), foodwindow=foodwindow) for j in range(1,2)]
    [item.start() for item in Chefs]
    [item.start() for item in Customers]
    [item.join() for item in Chefs]
    Chefs[0].makeDuBaozi(len(Customers))
    [punish(item) for item in Chefs]

在这里插入图片描述

以上犯罪份子均被制裁,毕竟python编程也不是法外之地

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值