• Python生产者消费者模型


    生产者消费者模型

    初识生产者消费者

    • 生产者: 生产数据的任务

    • 消费者: 处理数据的任务

    • 生产者--队列(盆)-->消费者

    • 生产者可以不停的生产,达到了自己最大的生产效率,消费者可以不停的消费,也达到了自己最大的消费效率.

    • 生产者消费者模型大大提高了生产者生产的效率和消费者消费的效率.

    • 补充: queue不适合传大文件,通产传一些消息.

    from multiprocessing import Process,Queue
    def god(q,name,food):
        ##生产者要做的事情
        for i in range(1,4):
            print(f'{name}做出了{food}{i}')
            res = f'{food}{i}'
            q.put(res)
        q.put(None)
    def consumer(q,name):
        #消费者要做的事情
        while True:
            res = q.get(timeout= 5 )
            #如果那么#
            if res is None:break
            print(f'{name}吃了{res}')
    
    if __name__ == '__main__':
        q = Queue()
        p1 = Process(target= god , args=(q,'guapi','包子'))
        c1 = Process(target= consumer , args=(q,'小强'))
        p1.start()
        c1.start()
    

    上述代码是解决单个生产者与消费者的问题,问题来了,如果我有多个生产者,多个消费者呢?

    from multiprocessing import Process,Queue
    import time,random
    
    def producer(q,name,food):
        '''生产者'''
        for i in range(3):
            print(f'{name}生产了{food}{i}')
            time.sleep(random.randint(1, 3))
            res = f'{food}{i}'
            q.put(res)
        # q.put(None)
    
    def consumer(q,name):
        '''消费者'''
        while True:
            res = q.get(timeout=5)
            if res is None:break
            time.sleep(random.randint(1,3))
            print(f'{name}吃了{res}')
    
    if __name__ == '__main__':
        q = Queue()
        p1 = Process(target=producer,args=(q,'rocky','包子'))
        p2 = Process(target=producer,args=(q,'mac','韭菜'))
        p3 = Process(target=producer,args=(q,'nick','蒜泥'))
        c1 = Process(target=consumer,args=(q,'成哥'))
        c2 = Process(target=consumer,args=(q,'浩南哥'))
        p1.start()
        p2.start()
        p3.start()
        c1.start()
        c2.start()
        p1.join()
        p2.join()
        p3.join() # 生产者生产完毕
        q.put(None)# 几个消费者put几次
        q.put(None)
    
  • 相关阅读:
    OpenGL------光照+染色
    sicily 1345 能量项链
    sicily 1193 Up the Stairs
    sicily 1172 Queens, Knights and Pawns
    sicily 1206 Stacking Cylinders
    模拟退火算法解tsp问题
    js对象的属性可以是一个变量
    vue中/deep/的使用
    MySQL中DATEDIFF函数使用
    js中的this
  • 原文地址:https://www.cnblogs.com/ledgua/p/11536562.html
Copyright © 2020-2023  润新知