1、什么是生产者消费者模型?
生产者:比喻的是程序中负责产生数据的任务
消费者:比喻的是程序中负责处理数据的任务
生产者>>共享的介质(队列)<<消费者
2、为何用?
实现了生产者与消费者的解耦和,生产者可以不停的生产,消费者也可以不停的消费;
从而平衡了生产者的生产能力与消费者的消费能力,提升了程序的整体运行效率
什么时候用?
当我们的程序中存在明显的两类任务,一类负责产生数据,另一类负责处理数据;
此时就应该考虑使用生产者消费者模型里啊提升程序效率
3、进程间的通信(ICP)之队列
#方式一:pipe 方式二:queue: pipe+锁 from multiprocessing import Queue q=Queue(3) #队列对象 先进先出 队列中放三条任意类型信息 #注:队列占用的是内存空间;不应该存放大数据,应该只存放数据量较小的信息 q.put('first') #放队列信息 q.put('f') q.put('d') #放的消息超过队列设置的限制,队列堵塞,必须要取走 print(q.get()) #取队列信息
#生产者们与消费者们
import os import random from multiprocessing import Process,JoinableQueue import time def producer(name,food,q): for i in range(10): res= '%s %s'%(food,i) time.sleep(random.randint(1,3)) q.put(res) #将信息放到队列中 print('%s生产了%s'%(name,res)) #q.put(None) #最后的信息为none def consumer(name,q): while True : res=q.get() #取队列信息 if res is None :break #取出none时就结束 time.sleep(random.randint(1,3)) print('%s 吃了%s' %(name,res)) q.task_done() #告诉队列已经有个数据被取走 if __name__ == '__main__': q= JoinableQueue() #队列对象 p1=Process(target=producer,args=('egon1','包子1',q,)) p2 = Process(target=producer, args=('egon2','包子2',q,)) p3 = Process(target=producer, args=('egon3','包子3',q,)) c1 = Process(target=consumer, args=('qqc1', q)) c2 = Process(target=consumer, args=('qqc2', 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.join() 结束意味着主进程代码完毕(生产者运行完毕,队列中的数据也被取干净) #消费者没有存在的意义要设置为守护进程 #print('父进程')