一.生产者消费者模型
生产者:程序中负责产生数据的任务
消费者:程序中负责处理数据的任务
模型:就是模板
生产者----->共享的介质(队列)------->消费者
生产者只与队列沟通,消费者也只与队列沟通.
二.为何用生产者消费者模型
实现了生产者与消费者之间的解耦和
生产者可以不停的生产,消费者可以不停的消费,从而平衡了生产者的生产能力与消费者的消费能力.提升了程序的运行效率.
当我们程序中明显存在两种任务,一种负责产生数据,一种负责处理数据,那么我们可以用生产者消费者模型.
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('主')