#模块:Queue #导入方法:from multiprocessing import Process,Queue #模块方法: from multiprocessing import Queue 借助Queue解决生产者消费者模型 队列是安全的。 q = Queue(num) num : 队列的最大长度 q.get()# 阻塞等待获取数据,若是有数据直接获取,若是没有数据,阻塞等待 q.put()# 阻塞,若是能够继续往队列中放数据,就直接放,不能放就阻塞等待 q.get_nowait()# 不阻塞,若是有数据直接获取,没有数据就报错 q.put_nowait()# 不阻塞,若是能够继续往队列中放数据,就直接放,不能放就报错 #使用方法:生产者消费者模型(主要是为解耦) ################### from multiprocessing import Process,Queue import time def consumer(q,student): while 1: str=q.get() if str: print(student+"拿走了{}".format(str)) else: #若是该字符串为空,表示生产者中止生产,则消费者程序退出,不然将会在q.get()中阻塞程序 break def producer(q,version): for i in range(20): info = version+"{}的蛋糕".format(i) q.put(info) q.put(None) #生产中止的标志,告诉消费者再也不生产产品 if __name__ == '__main__': q=Queue() pCon=Process(target=consumer,args=(q,'学生')) pPro=Process(target=producer,args=(q,'粤牌')) pCon.start() pPro.start() #扩充,能够在父进程中写q.put(None)而不须要在生产者中写,但必须保证生产者能完整生产全部产品,即父进程等待生产者进程的方法为join #pPro.join() #q.put(None) #若是有多个生产者,可是最后的结束标志须要根据消费者进程数进行设置,好比有2个消费者进程,则需q.put(None)两次
###################################
from multiprocessing import Queue# 是用于多进程的队列,就是专门用来作进程间通讯(IPC)。
import queue# 是用于同一进程内的队列,不能作多进程之间的通讯安全
# q = queue.Queue()
# # 先进先出
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())
# print(q.get())spa
# q = queue.LifoQueue()
# # 后进先出的队列
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())code
q = queue.PriorityQueue()
# 优先级队列,put()方法接收的是一个元组(),第一个位置是优先级,第二个位置是数据
# 优先级若是是数字,直接比较数值
# 若是是字符串,是按照 ASCII 码比较的。当ASCII码相同时,会按照先进先出的原则
# q.put((1,'abc'))
# q.put((5,'qwe'))
# q.put((-5,'zxc'))
# print(q.get())
# print(q.get())
# print(chr(48))orm
#模块:JoinableQueue #导入方法:from multiprocessing import Process,JoinableQueue #模块方法: JoinableQueue是继承Queue,因此可使用Queue中的方法 而且JoinableQueue又多了两个方法 q=JoinableQueue() q.join()# 用于生产者。等待 q.task_done的返回结果,经过返回结果,生产者就能得到消费者当前消费了多少个数据 q.task_done() # 用于消费者,是指每消费队列中一个数据,就给join返回一个标识。 #使用方法:生产者消费者模型 from multiprocessing import Process,JoinableQueue q = JoinableQueue() # 假设生产者生产了100个数据,join就能记录下100这个数字。每次消费者消费一个数据,就必需要task_done返回一个标识,当生产者(join)接收到100个消费者返回来的标识的时候,生产者就能知道消费者已经把全部数据都消费完了。 from multiprocessing import Queue,Process import time def consumer(q,name,color): while 1: info = q.get() print('%s %s 拿走了%s \033[0m'%(color,name,info)) q.task_done() def producer(q,product): for i in range(20): info = product + '的娃娃%s号'%str(i) q.put(info) q.join()# 记录了生产了20个数据在队列中,此时会阻塞等待消费者消费完队列中全部数据 if __name__ == '__main__': q = JoinableQueue(10) p_pro1 = Process(target=producer,args=(q,'岛国米饭保你爱')) p_con1 = Process(target=consumer,args=(q,'alex','\033[31m')) p_con1.daemon = True# 把消费者进程设为守护进程 p_con1.start() p_pro1.start() p_pro1.join()# 主进程等待生产者进程结束 # 程序有3个进程,主进程和生产者进程和消费者进程。 当主进程执行到35行代码时,主进程会等待生产进程结束 # 而生产进程中(第26行)会等待消费者进程把全部数据消费完,生产者进程才结束。 # 如今的状态就是 主进程等待生产者进程结束,生产者进程等待消费者消费完全部数据 # 因此,把消费者设置为守护进程。 当主进程执行完,就表明生产进程已经结束,也就表明消费者进程已经把队列中数据消费完 # 此时,主进程一旦结束,守护进程也就是消费者进程也就跟着结束。 整个程序也就能正常结束了。