生产者和消费者模型,为什么代码正常运行,却无法结束?
import threading
import time
import queue
import random
# 创建队列
q = queue.Queue()
# 生产者
def Producer(name):
for i in range(10):
# 将制作的小蛋糕放入队列中
# 生产者按照生产蛋糕的顺序来给蛋糕做标志
cake = {}
cake[name] = i+1
q.put(cake[name])
# print('%s制作了%s个蛋糕' % (name, cake[name]))
time.sleep(1)
# 消耗者
def Consumer(name):
while True:
# 取出蛋糕并吃掉
get_cake = q.get()
eat_cake = []
eat_cake.append(get_cake)
cake_num = len(eat_cake)
# print(get_cake)
print(f'{name}吃掉1个蛋糕,还剩{10-get_cake}个')
time.sleep(0.3)
return '%s共吃掉%s个蛋糕' % (name, cakes_num)
if __name__ == '__main__':
# 创建线程,一个生产者,三个消费者
p = threading.Thread(target=Producer, args=('慕慕',))
c1 = threading.Thread(target=Consumer, args=('小明',))
c2 = threading.Thread(target=Consumer, args=('小红',))
c3 = threading.Thread(target=Consumer, args=('安安',))
p.start()
c1.start()
c2.start()
c3.start()
p.join()
c1.join()
c2.join()
c3.join()
return 语句为什么无法返回呢?
25
收起
正在回答
1回答
同学,你好!1
1、因为while True 一直为真,所以一直在循环while语句,所以执行不到后续的 return 语句,同学可以在while 循环中加个判断,如果队列为空则停止循环,代码如下图:
while 循环结束后可以执行到return 语句,但是return 是函数返回值,需要函数调用处进行输出,线程无法实现。不能实现统计每人吃了多少蛋糕。可以定义一个字典,对人名进行判断,对人名出现次数进行累加,就是一个人吃了多少块蛋糕。具体代码如下图:
import threading import time import queue import random # 创建队列 q = queue.Queue() # 生产者 def Producer(name): for i in range(10): # 将制作的小蛋糕放入队列中 # 生产者按照生产蛋糕的顺序来给蛋糕做标志 cake = {} cake[name] = i + 1 q.put(cake[name]) print('%s制作了%s个蛋糕' % (name, cake[name])) time.sleep(1) user={"小红":0,"安安":0,"小明":0} # 消耗者 def Consumer(name): while True: # 取出蛋糕并吃掉 get_cake = q.get() eat_cake = [] eat_cake.append(get_cake) cake_num = len(eat_cake) if name=="小明": user["小明"] +=1 elif name == "安安": user["安安"] += 1 else: user["小红"] += 1 print(f'{name}吃掉1个蛋糕,还剩{10 - get_cake}个') time.sleep(3) if q.empty(): break # return '%s共吃掉%s个蛋糕' % (name, cakes_num) if __name__ == '__main__': # 创建线程,一个生产者,三个消费者 p = threading.Thread(target=Producer, args=('慕慕',)) c1 = threading.Thread(target=Consumer, args=('小明',)) c2 = threading.Thread(target=Consumer, args=('小红',)) c3 = threading.Thread(target=Consumer, args=('安安',)) p.start() c1.start() c2.start() c3.start() p.join() c1.join() c2.join() c3.join() print(user)
祝学习愉快~
Python全能工程师
- 参与学习 人
- 提交作业 16233 份
- 解答问题 4470 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星