栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python多线程退出(张三之毒包子案)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python多线程退出(张三之毒包子案)

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编程也不是法外之地

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/341414.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号