队列
队列:底层就是以管道和锁定的方式实现
目的: 多个进程之间通信使用的,一个进程将数据放到队列里面,另外一个进程从队列里面取走数据,干的是进程之间通信的活
队列的大小:是使用内存的大小
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
'''
生产者消费者模型
生产者指的是生产数据的任务,消费者指的是处理数据的任务
生产者消费者的模型:生产者《==》队列《===》消费者
好处:程序解开耦合,生产者与消费者不直接通信,平衡了生产者与消费者的速度差
from multiprocessing import Process,Queue
import timedef producer(q):for i in range(3):res = '包子%s' %itime.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:breaktime.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
from multiprocessing import Process,JoinableQueue
import timedef producer(q):for i in range(2):res = '包子%s' %itime.sleep(0.5)print('生产者生产了%s' %res)q.put(res)q.join() # 等队列执行完def consumer(q):while True:res = q.get()if res is None:breaktime.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 = Truec2.daemon = Truep1.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
主
'''