生产者消费者模型

初识生产者消费者

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

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

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

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

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

  • 补充: 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)