小白学python-------------并发编程之生产者消费者模型

一.生产者消费者模型

生产者:程序中负责产生数据的任务

消费者:程序中负责处理数据的任务

模型:就是模板

生产者----->共享的介质(队列)------->消费者

生产者只与队列沟通,消费者也只与队列沟通.

二.为何用生产者消费者模型

实现了生产者与消费者之间的解耦和

生产者可以不停的生产,消费者可以不停的消费,从而平衡了生产者的生产能力与消费者的消费能力.提升了程序的运行效率.

当我们程序中明显存在两种任务,一种负责产生数据,一种负责处理数据,那么我们可以用生产者消费者模型.

import time
import random
from multiprocessing import Process, JoinableQueue


def producer(name, food, q):
    for i in range(3):
        res = '%s%s' % (food, i)
        time.sleep(random.randint(1, 3))
        # 放进队列
        q.put(res)
        print('\033[45m%s 生产了%s\033[0m' % (name, res))


def consumer(name, q):
    while True:
        # 从队列里取走
        res = q.get()
        time.sleep(random.randint(1, 3))
        print('\033[46m%s 吃了%s\033[0m' % (name, res))
        q.task_done()  # 只是告诉队列有一个数据被取走了,并不代表结束


if __name__ == '__main__':
    # 先造一个队列
    q = JoinableQueue()

    # 生产者们
    p1 = Process(target=producer, args=('egon', '包子', q,))
    p2 = Process(target=producer, args=('tom', '馒头', q,))
    p3 = Process(target=producer, args=('bob', '点心', q,))

    # 消费者们
    c1 = Process(target=consumer, args=('alex', q,))
    c2 = Process(target=consumer, args=('aaa', 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()  # 让主进程等q结束,等待队列被取干净
    # q.join()意味着主进程的代码运行完毕--->(生产者运行完毕)+队列中的数据也被取干净--->消费者全部取完数据,没有存在的意义
    print('主')

猜你喜欢

转载自blog.csdn.net/qq_42721964/article/details/82457546