python 多线程主动结束消费者线程
多线程概念
不作赘述
本文解决问题
python多线程(消费者)退出
上代码
- 证物
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投毒
相关案件
- 顾客多于厨师
#案发经过
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编程也不是法外之地