并发编程---队列---生产者消费者模型
队列
队列:底层就是以管道和锁定的方式实现
目的: 多个进程之间通信使用的,一个进程将数据放到队列里面,另外一个进程从队列里面取走数据,干的是进程之间通信的活
队列的大小:是使用内存的大小
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from multiprocessing import Queue q = Queue(3) q.put('hello') q.put({'a':1}) q.put([3,3,3]) print(q.full()) # 查看队列是否满了 print(q.get()) print(q.get()) print(q.get()) q.empty() # 清空队列的数据 print(q.full()) ''' 打印结果: True hello {'a': 1} [3, 3, 3] False '''
生产者消费者模型
生产者指的是生产数据的任务,消费者指的是处理数据的任务
生产者消费者的模型:生产者《==》队列《===》消费者
好处:程序解开耦合,生产者与消费者不直接通信,平衡了生产者与消费者的速度差
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from multiprocessing import Process,Queue import time def producer(q): for i in range(3): res = '包子%s' %i time.sleep(0.5) print('生产者生产了%s' %res) q.put(res) # q.put(None) # 不能在这写的原因:因为含有多个生产者,生产者1生产结束后发送信号,这时其他生产者还可能没有生产完,消费者在取的时候,碰到生产者1就结束了。 def consumer(q): while True: res = q.get() if res is None:break time.sleep(1) print('消费者吃了%s' %res) if __name__ == '__main__': #容器 q = Queue() #生产者们 p1 = Process(target=producer,args=(q,)) p2 = Process(target=producer,args=(q,)) p3 = Process(target=producer,args=(q,)) #消费者们 c1 = Process(target=consumer,args=(q,)) c2 = Process(target=consumer,args=(q,)) p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() # 保证了p1这个进程执行完了 p2.join() p3.join() q.put(None) q.put(None) print('主') ''' 打印结果: 生产者生产了包子0 生产者生产了包子0 生产者生产了包子0 生产者生产了包子1 生产者生产了包子1 生产者生产了包子1 消费者吃了包子0 生产者生产了包子2 消费者吃了包子0 生产者生产了包子2 生产者生产了包子2 主 消费者吃了包子0 消费者吃了包子1 消费者吃了包子1 消费者吃了包子1 消费者吃了包子2 消费者吃了包子2 消费者吃了包子2 '''
JoinableQueue
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from multiprocessing import Process,JoinableQueue import time def producer(q): for i in range(2): res = '包子%s' %i time.sleep(0.5) print('生产者生产了%s' %res) q.put(res) q.join() # 等队列执行完 def consumer(q): while True: res = q.get() if res is None:break time.sleep(1) print('消费者吃了%s' %res) q.task_done() # 可以告诉生产者,已经有一个数据被取走 if __name__ == '__main__': #容器 q = JoinableQueue() #生产者们 p1 = Process(target=producer,args=(q,)) p2 = Process(target=producer,args=(q,)) p3 = Process(target=producer,args=(q,)) #消费者们 c1 = Process(target=consumer,args=(q,)) c2 = Process(target=consumer,args=(q,)) c1.daemon = True c2.daemon = True p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() p2.join() p3.join() print('主') ''' 打印结果: 生产者生产了包子0 生产者生产了包子0 生产者生产了包子0 生产者生产了包子1 生产者生产了包子1 生产者生产了包子1 消费者吃了包子0 消费者吃了包子0 消费者吃了包子0 消费者吃了包子1 消费者吃了包子1 消费者吃了包子1 主 '''