python 生产者与消费者模型

真正开发中不会用该方法在同一台机器上这样操作,该文章只是提供一种解决方案和思路


【用途】

程序中有两类
一类负责生产数据(生产者)
一类负责处理数据(消费者)
用于平衡两者的速度差 与 程序揭开耦合

生产者<——>列队<——>消费者

# 原理,生产者将生产的对象丢到队列里边,消费者从队列里边取出数据

import time
from multiprocessing import Queue
from multiprocessing import Process

def producer(q):  # 生产者
    for i in range(5):
        res = '包子%s' % i
        time.sleep(1)  # 模拟延时
        print('生产者生产了:%s' % res)
        q.put(res)  # 把生产的放进容器

def consumer(q):  # 消费者
    while True:
        res = q.get()  # 从容器中取出来消费
        if res is None:
            break
        time.sleep(2)  # 模拟延时
        print('消费者吃了%s' % res)

if __name__ == '__main__':
    # 容器
    q = Queue()
    # 生产者
    p = Process(target=producer, args=(q,))  # 把容器传进去
    # 消费者
    c1 = Process(target=consumer, args=(q,))

    p.start()
    c1.start()
    # 因为子进程是循环,所以会导致子禁止一直在循环
    p.join()  # 这样可以保证在生产者生产完后执行代码
    q.put(None)  # 传一个None 在消费者内取值判断,如果多个生产者就传入多个 q.put(None)

【另外一种列队JoinableQueue 】

比Queue更高级,在处理主进程完毕后,子进程仍然运行的问题上

import time
from multiprocessing import JoinableQueue
from multiprocessing import Process


def producer(q):  # 生产者
    for i in range(5):
        res = '包子%s' % i
        time.sleep(1)  # 模拟延时
        print('生产者生产了:%s' % res)
        q.put(res)  # 把生产的放进容器
    q.join()  # 等待取空

def consumer(q):  # 消费者
    while True:
        res = q.get()  # 从容器中取出来消费
        if res is None:
            break
        time.sleep(2)  # 模拟延时
        print('消费者吃了%s' % res)
        q.task_done()  # 通知有一个数据被取走

if __name__ == '__main__':
    # 容器
    q = JoinableQueue()
    q.join()
    # 生产者
    p = Process(target=producer, args=(q,))  # 把容器传进去
    # 消费者
    c1 = Process(target=consumer, args=(q,))
    c1.daemon = True  # 设置为守护进程

    p.start()
    c1.start()

    p.join()  # 等主进程运行完,q.join也运行完了,所以用守护进程结束掉子进程即可

猜你喜欢

转载自blog.csdn.net/weixin_42329277/article/details/80712578