zoukankan      html  css  js  c++  java
  • 生产者消费者模型

    第一种实现方案

    生产者生产完,让生生产告诉主进程他们已经结束,让后主进程给消费者发一个结束指令,消费者拿出所有产品,等拿到结束指令结束
    from multiprocessing import Queue,Process,JoinableQueue
    
    def producer(name,food,q):
        for i in range(10):
            res = "%s%s"%(food,i)
            time.sleep(random.randint(1,2))
            q.put(res)
            print('厨师[%s]做了[%s]%s'%(name,food,i))
    
    
    
    def consumer(name,q):
        while True:
            res = q.get()
            if res is None:break
            time.sleep(random.randint(1,3))
            print('吃货[%s]吃了[%s]'%(name,res))
    
    if __name__ == '__main__':
        q = Queue()
    
        p1 = Process(target=producer,args=('刘大厨','包子',q))
        p2 = Process(target=producer,args=('李大厨','馒头',q))
        p3 = Process(target=producer,args=('林大厨','辣条',q))
    
        c1 = Process(target=consumer,args=('张三',q)).start()
        c2 = Process(target=consumer,args=('李四',q)).start()
    
        p1.start()
        p2.start()
        p3.start()
    
        p1.join()
        p2.join()
        p3.join()
    
        q.put(None)
        q.put(None)
    
        print('主进程的活干完了waiting...............')

     第二种实现方案

    第二种实现方案,就是在用JoinableQueue,等消费者拿完所有的产品结束,q.task_done()告诉队列结束,q.join()结束意味着所有都拿完,让消费者作为主进程的守护进程,
    与主进程一同结束
    from multiprocessing import Queue,Process,JoinableQueue
    
    def producer(name,food,q):
        for i in range(10):
            res = "%s%s"%(food,i)
            time.sleep(random.randint(1,2))
            q.put(res)
            print('厨师[%s]做了[%s]%s'%(name,food,i))
    
    
    
    def consumer(name,q):
        while True:
            res = q.get()
            # if res is None:break
            time.sleep(random.randint(1,3))
            print('吃货[%s]吃了[%s]'%(name,res))
            q.task_done()
    
    if __name__ == '__main__':
        q = JoinableQueue()
    
        p1 = Process(target=producer,args=('刘大厨','包子',q))
        p2 = Process(target=producer,args=('李大厨','馒头',q))
        p3 = Process(target=producer,args=('林大厨','辣条',q))
    
        c1 = Process(target=consumer,args=('张三',q))
        c2 = Process(target=consumer,args=('李四',q))
    
        c1.daemon = True
        c2.daemon = True
    
        p1.start()
        p2.start()
        p3.start()
    
        c1.start()
        c2.start()
    
        p1.join()
        p2.join()
        p3.join()
    
        q.join()
    
        print('主进程的活干完了waiting...............')
  • 相关阅读:
    Visual Studio ------ 多项目启动
    windows ------ 系统激活 win10
    Java ----- 递归与迭代
    SpringCloud:初识(微服务与SpringCloud)
    The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    Solr:SolrJ(增删改查)
    Solr:后台管理界面的使用(管理索引库、导入数据库数据、查询)
    Solr:Slor初识(概述、Windows版本的安装、添加IK分词器)
    Vue:v-model的使用
    Vue:循环遍历(v-for)
  • 原文地址:https://www.cnblogs.com/zhaijihai/p/10418625.html
Copyright © 2011-2022 走看看