• 基于队列实现生产者消费者模型


    code
    from multiprocessing import Process,Queue
    import time,random,os
     
    def consumer(q,p1):
        while True:
            res=q.get()
            if(res=="finish"):
                break
            time.sleep(random.randint(1,3))
            print('%s 吃 %s' %(os.getpid(),res))
     
    def producer(q):
        for i in range(10):
            time.sleep(random.randint(1,3))
            res='包子%s' %i
            q.put(res)
            print('生产了 %s' %(str(os.getpid())+res))
     
    if __name__ == '__main__':
        q=Queue()
        #生产者们:即厨师们
        q.put("tea")
     
        p1=Process(target=producer,args=(q,))
        #消费者们:即吃货们
        c1=Process(target=consumer,args=(q,p1),)
     
        #开始
        p1.start()
        c1.start()
     
        p1.join()
        q.put("finish")
        print('')
    Outputs
    macname@MacdeMacBook-Pro py % python3 cccccc.py
    58397 吃 tea
    生产了 58396包子0
    58397 吃 包子0
    生产了 58396包子1
    58397 吃 包子1
    生产了 58396包子2
    58397 吃 包子2
    生产了 58396包子3
    58397 吃 包子3
    生产了 58396包子4
    58397 吃 包子4
    生产了 58396包子5
    58397 吃 包子5
    生产了 58396包子6
    生产了 58396包子7
    58397 吃 包子6
    生产了 58396包子8
    58397 吃 包子7
    58397 吃 包子8
    生产了 58396包子9
    主
    58397 吃 包子9
    macname@MacdeMacBook-Pro py %
     
    可自动退出版本

    Code
    from multiprocessing import Process,Queue
    import time,random,os
    def consumer(q):
        while True:
            res=q.get()
            if res is None:break #收到结束信号则结束
            time.sleep(random.randint(1,3))
            print('%s 吃 %s' %(os.getpid(),res))
     
    def producer(q):
        for i in range(10):
            time.sleep(random.randint(1,3))
            res='包子%s' %i
            q.put(res)
            print('%s生产了 %s' %(os.getpid(),res))
        q.put(None) #发送结束信号
    if __name__ == '__main__':
        q=Queue()
        #生产者们:即厨师们
        p1=Process(target=producer,args=(q,))
     
        #消费者们:即吃货们
        c1=Process(target=consumer,args=(q,))
     
        #开始
        p1.start()
        c1.start()
        print('')
    Outputs
    macname@MacdeMacBook-Pro py % python3 cccccc.py
    主
    58417生产了 包子0
    58418 吃 包子0
    58417生产了 包子1
    58418 吃 包子1
    58417生产了 包子2
    58418 吃 包子2
    58417生产了 包子3
    58417生产了 包子4
    58418 吃 包子3
    58417生产了 包子5
    58418 吃 包子4
    58417生产了 包子6
    58417生产了 包子7
    58418 吃 包子5
    58417生产了 包子8
    58418 吃 包子6
    58418 吃 包子7
    58418 吃 包子8
    58417生产了 包子9
    58418 吃 包子9
    macname@MacdeMacBook-Pro py %

    主进程在生产者生产完毕后发送结束信号None

    code
    from multiprocessing import Process,Queue
    import time,random,os
    def consumer(q):
        while True:
            res=q.get()
            if res is None:break #收到结束信号则结束
            time.sleep(random.randint(1,3))
            print('%s 吃 %s' %(os.getpid(),res))
     
    def producer(q):
        for i in range(2):
            time.sleep(random.randint(1,3))
            res='包子%s' %i
            q.put(res)
            print('%s生产了 %s' %(os.getpid(),res))
     
    if __name__ == '__main__':
        q=Queue()
        #生产者们:即厨师们
        p1=Process(target=producer,args=(q,))
     
        #消费者们:即吃货们
        c1=Process(target=consumer,args=(q,))
     
        #开始
        p1.start()
        c1.start()
     
        p1.join()
        q.put(None) #发送结束信号
        print('')
    Outputs
    macname@MacdeMacBook-Pro py % python3 cccccc.py
    58426生产了 包子0
    58426生产了 包子1
    58427 吃 包子0
    主
    58427 吃 包子1
    macname@MacdeMacBook-Pro py %
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    项目实战15—企业级堡垒机 jumpserver
    ELK重难点总结和整体优化配置
    ELK 经典用法—企业自定义日志收集切割和mysql模块
    项目实战14—ELK 企业内部日志分析系统
    搭建内网映射服务
    超好用内网映射神器
    Linux官方源、镜像源汇总
    搭建企业级PPTP服务器
    Ansible的Inventory管理
    Ansible的快速入门
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14193161.html
Copyright © 2020-2023  润新知