Python——进程队列
队列 先进先出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from multiprocessing import Queue 2 q = Queue(5) #队列的大小 3 q.put(1) #放入内容 4 q.put(2) #放入内容 5 q.put(3) #放入内容 6 q.put(4) #放入内容 7 q.put(5) #放入内容 8 print(q.full()) #你的队列是否满了 9 print(q.get()) #取出队列中目前排在最前面的数 10 q.empty() #判断队列是否为空
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from multiprocessing import Queue,Process 2 def produce(q): 3 q.put('hello') 4 5 def consume(q): 6 print(q.get()) 7 8 if __name__ == '__main__': 9 q = Queue() 10 p = Process(target=produce,args=(q,)) 11 p.start() 12 c = Process(target=consume, args=(q,)) 13 c.start()
生产者消费者模型,解决供需不平和的问题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 队列 2 # 生产者消费者模型 3 4 # 生产者 进程 5 # 消费者 进程 6 import time 7 import random 8 from multiprocessing import Process,Queue 9 def consumer(q,name): 10 while True: 11 food = q.get() 12 if food is None: 13 print('%s获取到了一个空'%name) 14 break 15 print('\033[31m%s消费了%s\033[0m' % (name,food)) 16 time.sleep(random.randint(1,3)) 17 18 def producer(name,food,q): 19 for i in range(4): 20 time.sleep(random.randint(1,3)) 21 f = '%s生产了%s%s'%(name,food,i) 22 print(f) 23 q.put(f) 24 25 if __name__ == '__main__': 26 q = Queue(20) 27 p1 = Process(target=producer,args=('Egon','包子',q)) 28 p2 = Process(target=producer, args=('wusir','泔水', q)) 29 c1 = Process(target=consumer, args=(q,'alex')) 30 c2 = Process(target=consumer, args=(q,'jinboss')) 31 p1.start() 32 p2.start() 33 c1.start() 34 c2.start() 35 p1.join() 36 p2.join() 37 q.put(None) 38 q.put(None)
使用joinableQueue解决生产消费者问题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import time 2 import random 3 from multiprocessing import Process,JoinableQueue 4 def consumer(q,name): 5 while True: 6 food = q.get() 7 print('\033[31m%s消费了%s\033[0m' % (name,food)) 8 time.sleep(random.randint(1,3)) 9 q.task_done() # count - 1 10 11 def producer(name,food,q): 12 for i in range(4): 13 time.sleep(random.randint(1,3)) 14 f = '%s生产了%s%s'%(name,food,i) 15 print(f) 16 q.put(f) 17 q.join() # 阻塞 直到一个队列中的所有数据 全部被处理完毕 18 19 if __name__ == '__main__': 20 q = JoinableQueue(20) 21 p1 = Process(target=producer,args=('Egon','包子',q)) 22 p2 = Process(target=producer, args=('wusir','泔水', q)) 23 c1 = Process(target=consumer, args=(q,'alex')) 24 c2 = Process(target=consumer, args=(q,'jinboss')) 25 p1.start() 26 p2.start() 27 c1.daemon = True # 设置为守护进程 主进程中的代码执行完毕之后,子进程自动结束 28 c2.daemon = True 29 c1.start() 30 c2.start() 31 p1.join() 32 p2.join() # 感知一个进程的结束 33 34 # 在消费者这一端: 35 # 每次获取一个数据 36 # 处理一个数据 37 # 发送一个记号 : 标志一个数据被处理成功 38 39 # 在生产者这一端: 40 # 每一次生产一个数据, 41 # 且每一次生产的数据都放在队列中 42 # 在队列中刻上一个记号 43 # 当生产者全部生产完毕之后, 44 # join信号 : 已经停止生产数据了 45 # 且要等待之前被刻上的记号都被消费完 46 # 当数据都被处理完时,join阻塞结束 47 48 # consumer 中把所有的任务消耗完 49 # producer 端 的 join感知到,停止阻塞 50 # 所有的producer进程结束 51 # 主进程中的p.join结束 52 # 主进程中代码结束 53 # 守护进程(消费者的进程)结束