10月30日生产者消费者模型

发布时间 2023-10-31 08:38:45作者: songjunwan

生产者消费者模型

生产者:生产数据的任务

消费者: 处理数据的任务

例子:假设有一个包子铺,做包子的人就是生产者,来吃包子的就是消费者,然后生产者会把生产好的包子放到对应的保温容器内(队列),消费者从这个容器内拿走(队列)进行品尝

from multiprocessing import Process, Queue


def shengchanzhe(q, name, food):
    """生产者"""
    for i in range(10):
        print(f'{name}生产了{food}{i}')
        res = f'{food}{i}'#这里将包子以及包子的号给赋值给res这个变量

        q.put(res)#生产者把生产好的包子存入队列里面
        # consunmer(res)


def xiaofeizhe(q, name):
    """消费者"""
    while True:

        res = q.get()#消费者将生产好的包子从队列里面取出来

        print(f'{name}吃了包子{res}')


if __name__ == '__main__':
    # 这里用队列
    q = Queue()#这里生成一个队列q

    p1 = Process(target=shengchanzhe, args=(q,'jocker', '狗不理包子'))#这里将队列,生产者姓名,包子名字传参进去
    c1 = Process(target=xiaofeizhe, args=(q, '吃货A'))#这里将队列,消费者姓名传参进去

    p1.start()
    # p1.join()#添加这一步是为了让打印结果好看一点
    c1.start()

结果为

这个结果就体现了我的要求,在生产者生产的时候我的消费者也可以吃,然后我消费者在吃的时候生产者还在生产。

理想的流程就是:生产者--队列--消费者

生产者可以不停的生产然后把生产的结果放到队列里面达到了最大的生产效率,消费者可以从队列里面取走生产的结果也达到了最大的消费效率,大大提高了生产者生产的效率和消费者消费的效率。

这个代码有些Bug就是无法终止,具体原因和队列有关系,因为我没有给队列设置终止时间

这里给获取添加timeout即可

from multiprocessing import Process, Queue


def shengchanzhe(q, name, food):
    """生产者"""
    for i in range(10):
        print(f'{name}生产了{food}{i}')
        res = f'{food}{i}'#这里将包子以及包子的号给赋值给res这个变量

        q.put(res)#生产者把生产好的包子存入队列里面
        # consunmer(res)


def xiaofeizhe(q, name):
    """消费者"""
    while True:

        res = q.get(timeout=5)#消费者将生产好的包子从队列里面取出来,这里设置一个时间来防止队列里面没有数据后代码无法结束

        print(f'{name}吃了包子{res}')


if __name__ == '__main__':
    # 这里用队列
    q = Queue()#这里生成一个队列q

    p1 = Process(target=shengchanzhe, args=(q,'jocker', '狗不理包子'))#这里将队列,生产者姓名,包子名字传参进去
    c1 = Process(target=xiaofeizhe, args=(q, '吃货A'))#这里将队列,消费者姓名传参进去

    p1.start()
    # p1.join()#添加这一步是为了让打印结果好看一点
    c1.start()

这个代码就可以解决堵塞的问题

也可以用判断循环的方式来解决这个问题

from multiprocessing import Process, Queue


def shengchanzhe(q, name, food):
    """生产者"""
    for i in range(10):
        print(f'{name}生产了{food}{i}')
        res = f'{food}{i}'#这里将包子以及包子的号给赋值给res这个变量

        q.put(res)#生产者把生产好的包子存入队列里面
        # consunmer(res)
    q.put(None)


def xiaofeizhe(q, name):
    """消费者"""
    while True:

        res = q.get(timeout=5)#消费者将生产好的包子从队列里面取出来,这里设置一个时间来防止队列里面没有数据后代码无法结束
        #这里添加判断方便终止代码
        if res is None:#如果从队列里面得到None这个数据就会结束这个循环
            break
        print(f'{name}吃了{res}')


if __name__ == '__main__':
    # 这里用队列
    q = Queue()#这里生成一个队列q

    p1 = Process(target=shengchanzhe, args=(q,'jocker', '狗不理包子'))#这里将队列,生产者姓名,包子名字传参进去

    c1 = Process(target=xiaofeizhe, args=(q, '吃货A'))#这里将队列,消费者姓名传参进去

    p1.start()
    # p1.join()#添加这一步是为了让打印结果好看一点
    c1.start()

补充

queue不适合传大文件,通常用于传一些信息即可