• 线程中put(None)和主函数中put(None)的区别和用法


    
    '''
    初试生产者消费者模型代码
    分析:
    对象含有生产者、队列、消费者
    Queue队列模块,不适合传大文件,通常传一些消息。
    
    
    '''
    '''多生产者进程和多消费者进程'''
    #导入模块
    from  multiprocessing import Process,Queue
    import time
    #生产者
    def producers(q,name,food):
        # 开始生产10个包子
        for i in range(3):
            print(f'{name}生产了{food}三丰牌{i}')
    
            res=f'{food}{i}'            #包子0-9当时卡了没有默写出来
            #把生产者生产的一大堆包子打包成一个变量,然后直接put到队列的管子里(q.put(res)),等待消费者去get
    
            #创建队列
            q.put(res)
        #队列结束标识
        # q.put(None)
    
    #消费者
    def consumers(q,name):
        while True:
            # 把包子接收过来,创建接收队列
            recive = q.get()
            # 然后接收队列进行判断,如果recive是'我生产完毕了'的话,消费者就停止再继续吃包子了
            if recive is None:
                break
            # time.sleep(3)
            print(f'{name}吃掉了{recive}')
    
    if __name__ == '__main__':
        #创建队列对象
        q=Queue()
    
        p1 = Process(target=producers, args=(q, '张三丰', '狗不理包子'))  # 此人生产者
        p2 = Process(target=producers, args=(q, '郭靖', '降龙十八掌包子'))  # 此人生产者
        p3 = Process(target=producers, args=(q, '黄蓉', '打狗棒包子'))  # 此人生产者
        c1 = Process(target=consumers, args=(q, 'luzhaoshan'))  # 此人消费者
        c2 = Process(target=consumers, args=(q, 'xiaobai'))  # 此人消费者
    
        p1.start()
        p2.start()
        p3.start()
        c1.start()
        c2.start()
    
    
    
    
    
    
        p1.join()
        p2.join()
        p3.join()       #用join方法保证生产者生产完毕
        q.put(None)
        q.put(None)     #几个消费者进程put几次
    
    
    '''
    问题01:
    为什么会产生生产9个包子,吃掉了6个包子的问题?
    
    解答:
    put一次None,结束一个进程,总共put了3次None,
    但是只接收了两个None,所以就会导致生产9个包子,
    只吃掉了6个包子。
    
    问题02:
    为什么是两次None?
    q.put(None)
    q.put(None)
    
    
    
    
    问题03:
    问什么q.put(None)要写在这个地方?
    
    
    
    问题04:
    不注释第27行代码,执行结果为什么会吃掉6个包子呢?
    
    
    
    
    
    
    运行结果如下:
    
    张三丰生产了狗不理包子三丰牌0
    张三丰生产了狗不理包子三丰牌1
    张三丰生产了狗不理包子三丰牌2
    郭靖生产了降龙十八掌包子三丰牌0
    郭靖生产了降龙十八掌包子三丰牌1
    郭靖生产了降龙十八掌包子三丰牌2
    黄蓉生产了打狗棒包子三丰牌0
    黄蓉生产了打狗棒包子三丰牌1
    黄蓉生产了打狗棒包子三丰牌2
    luzhaoshan吃掉了狗不理包子0
    luzhaoshan吃掉了狗不理包子1
    luzhaoshan吃掉了狗不理包子2
    xiaobai吃掉了降龙十八掌包子0
    xiaobai吃掉了降龙十八掌包子1
    xiaobai吃掉了降龙十八掌包子2
    
    
    '''
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    《the art of software testing》 第三章 人工测试
    unbutu下wireshark编译安装(已更新)
    Cygwin工具的简单使用
    第三周Linux编程实例练习
    ceph如何快速卸载所有osd及擦除磁盘分区表和内容并重新加入
    Redis集群的分布式部署
    redis主从同步
    redis编译安装
    kubeadm部署k8s
    openstack高可用集群19-linuxbridge结合vxlan
  • 原文地址:https://www.cnblogs.com/ludundun/p/11537780.html
Copyright © 2020-2023  润新知