多进程队列 Queue
# 栈:先进后出(First In Last Out 简称 FILO) # 队列: 先进先出(First In First Out 简称 FIFO) # # # import queue 不能进行多进程之间的数据传输 # from multiprocessing import Queue 借助Queue解决生产者消费者模型 # 队列是安全的。自带锁
from multiprocessing import Queue q = Queue(num) # num 队列的最大长度,为一个数字 q.get() # 阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待 q.put() # 阻塞,如果可以直接往队列中放数据,就直接放,如果不能放,就阻塞等待 q.get_nowait() # 不阻塞,如果有数据直接获取,没有数据就报错 q.put_nowait() # 不阻塞,如果可以继续往队列中放数据,就直接放,不能放就报错
案例
from multiprocessing import Queue q = Queue(3) # 队列的最大长度 q.put(123) q.put("abc") q.put([4, 5, 6]) print(q.get()) print(q.get()) print(q.get())
结果:
123
abc
[4, 5, 6]
正常执行,队列的长度为3,添加了三个,获取了三个
from multiprocessing import Queue q = Queue(3) # 队列的最大长度 q.put(123) q.put("abc") q.put([4, 5, 6]) q.put(999) print(q.get()) print(q.get()) print(q.get())
执行到q.put(999)阻塞,程序一直在等
from multiprocessing import Queue q = Queue(3) # 队列的最大长度 q.put(123) q.put("abc") q.put([4, 5, 6]) q.put_nowait(999) print(q.get()) print(q.get()) print(q.get())
执行到q.put(999)报错
from multiprocessing import Queue q = Queue(3) # 队列的最大长度 q.put(123) q.put("abc") q.put([4, 5, 6]) print(q.get()) print(q.get()) print(q.get()) print(q.get_nowait()) # queue.Empty
执行到print(q.get_nowait())报错
生产者和消费者
生产者消费者模型主要是为解耦,借助队列来实现生产者消费者模型
from multiprocessing import Queue, Process from time import sleep def consumer(q, name): while 1: info = q.get() if info: print('%s 拿走了%s' % (name, info)) else: # 当消费者获得队列中数据时,如果获得的是None,就是获得到了生产者不再生产数据的标识 break # 此时消费者结束即可 def producer(q, product): for i in range(5): info = '生产了' + product + '版的娃娃%s号' % str(i) q.put(info) print(info) q.put(None) # 让生产者生产完数据后,给消费者一个不再生产数据的标识 if __name__ == '__main__': q = Queue(5) pro = Process(target=producer, args=(q, '波多小姐')) con = Process(target=consumer, args=(q, '苍老师')) pro.start() con.start()
结果:
生产了波多小姐版的娃娃0号
生产了波多小姐版的娃娃1号
生产了波多小姐版的娃娃2号
生产了波多小姐版的娃娃3号
生产了波多小姐版的娃娃4号
苍老师 拿走了生产了波多小姐版的娃娃0号
苍老师 拿走了生产了波多小姐版的娃娃1号
苍老师 拿走了生产了波多小姐版的娃娃2号
苍老师 拿走了生产了波多小姐版的娃娃3号
苍老师 拿走了生产了波多小姐版的娃娃4号
改版上版的生产者和消费者
from multiprocessing import Queue, Process import time def consumer(q, name, color): while 1: info = q.get() if info: print('%s %s 拿走了%s 33[0m' % (color, name, info)) else: # 当消费者获得队列中数据时,如果获得的是None,就是获得到了生产者不再生产数据的标识 break # 此时消费者结束即可 def producer(q, product): for i in range(20): info = product + '的娃娃%s号' % str(i) q.put(info) if __name__ == '__main__': q = Queue(10) p_pro1 = Process(target=producer, args=(q, '波多小姐')) p_pro2 = Process(target=producer, args=(q, '苍老师')) p_pro3 = Process(target=producer, args=(q, '小泽老师')) p_con1 = Process(target=consumer, args=(q, '麻老师', '