无法停止程序,以及错误

无法停止程序,以及错误

问题描述:

我的程序为啥没有停止,而且执行的循序有错误呢??需要怎么改动呢?

而且结果是不对的

相关代码:

# coding:utf-8
'''
生产者消费者模型当中有两大重要的角色,一个是生产者(负责生产数据的任务)
另一个是消费者(接收生产出来的数据,并进行进一步的操作)
已知慕慕是生产者,为小朋友们制作小蛋糕,共制作了 10 只小蛋糕
小明、小红、安安 3 人是消费者,将慕慕制作的小蛋糕全部吃掉
请同学们结合多线程和队列的相关知识,根据以下任务提示,实现生产者和消费者模型的程序

'''
import json
import threading
import time
import queue

# 创建队列
q = queue.Queue()

# 生产者
def Producer(name):
    for i in range(10):
        print(name + "生产第%s块蛋糕" % (i+1))
        q.put(i+1)

# 消耗者
def Consumer(name):
    count = 0  # 循环
    while True:
        # 取出蛋糕并吃掉
        result = q.get()
        if count >= 4:
            break
        count += 1
        print("{}吃了第{}块蛋糕,一共是{}块蛋糕".format(name, result, count))


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()
    p.join()
    time.sleep(1)
    for c in (c1, c2, c3):
        c.start()

    if q.empty():
        print(">........")

相关截图:

https://img1.sycdn.imooc.com//climg/6263cbbb095f327f13640900.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕美 2022-04-23 18:31:57

同学,你好!同学可以打印下result和count值,当取出第10块蛋糕时,if条件是不成立的,因此循环会一直执行,程序不会结束

https://img1.sycdn.imooc.com//climg/6263d5860934835d10590456.jpg

祝学习愉快!

  • 提问者 qq_莫生好友_0 #1
    # coding:utf-8
    '''
    生产者消费者模型当中有两大重要的角色,一个是生产者(负责生产数据的任务)
    另一个是消费者(接收生产出来的数据,并进行进一步的操作)
    已知慕慕是生产者,为小朋友们制作小蛋糕,共制作了 10 只小蛋糕
    小明、小红、安安 3 人是消费者,将慕慕制作的小蛋糕全部吃掉
    请同学们结合多线程和队列的相关知识,根据以下任务提示,实现生产者和消费者模型的程序
    
    '''
    import json
    import threading
    import time
    import queue
    
    # 创建队列
    q = queue.Queue()
    
    # 生产者
    def Producer(name):
        for i in range(10):
            print(name + "生产第%s块蛋糕" % (i+1))
            q.put(i+1)
            time.sleep(1)
    
    # 消耗者
    def Consumer(name):
        count = 1  # 循环
        while True:
            # 取出蛋糕并吃掉
            result = q.get()
            count += 1
            print("{}吃了第{}块蛋糕".format(name, result))
            time.sleep(1)
    
    
    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()
        p.join()
        time.sleep(1)
        for c in (c1, c2, c3):
            c.start()

    还有一个问题就是,我这边在Consumer里面加了个等待后就不一样了呢?

    添加time.sleep(1)前

    https://img1.sycdn.imooc.com//climg/6263f33909f06b6d11130901.jpg

    添加time.sleep(1)后

    https://img1.sycdn.imooc.com//climg/6263f40709b5bf2c12250902.jpg


    2022-04-23 20:41:55
  • 好帮手慕美 回复 提问者 qq_莫生好友_0 #2

    同学,你好!

    1、多线程的执行顺序不是确定的,会存在"吃了第10块蛋糕"的线程输出了结果,但其他线程还没有执行结束,if条件不成立,因此程序没有结束

    2、使用time.sleep()会后挂起当前线程,执行其他线程

    祝学习愉快!

    2022-04-24 09:56:08
  • 提问者 qq_莫生好友_0 回复 好帮手慕美 #3

    明白,谢谢!

    2022-04-24 21:19:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师