###生产者消费者关系###
- 主要是解耦(高内聚,低耦合),借助队列来实现生产者消费者 模型
- 栈:先进后出(First In Last Out 简称:FILO)
- 队列:先进先出(First In First Out 简称:FIFO)
- import queue .............不能进行多进程之间的数据传输
1,队列:from multiprocessing import Queue借助Queue来解决生产者消费者模型,队列是安全的
- 1.1>q = Queue(num)也只能是数据一次次的放,一次次的拿(一进一出)
- num:队列的最大长度(表示对列里能刚的最多数据,当数据量较大时就会阻塞,等待进入到队列中)
- q .get():表示获取队列中的数据,如果队列中有数据是直接获取,此时就没有阻塞等待这么一说了,当队列没有数据时,它就会在这阻塞等获取数据.
- q.put():表示向管道里发送数据,当管道数据未满,(管道里被获取数据的速度大于发送的速度时,)这时就可以直接放到队列里,如果管道数据满(管道获里被获取数据的速度小于发送的速度时)发送端(生成者)这时就会处于阻塞状态
- q.get_nowait():不阻塞:队列里有数据时就直接获取,没有时就会直接报错(比较敏感,不能容忍)
- q.put_nowait():,不阻塞:,如果可以继续往队列中放数据,就直接放,不能就会报错(比较敏感,不能容忍)
- 1.2>JoinableQueue###可连接的队列
- from multiprocessing import JoinableQueue是继承了Queue,所以可以使用Queue中的方法
- 并且JoinableQueue又多了两个方法
- q.join():用于生产者.表示等待消费者q.task_done返回一个标识(ack),生产者就能获得消费者当前消费了多少个数据
- q.task_done()#用于消费者,是指每个消费队列中的一个数据,就给join返回一个标识
###第一种方法###是在生产者q.put(None)来给消费者提示队列的数据被消费完.(是子进程与子进程之间的通信)
from multiprocessing import Process,Queue # 导入队列的模块Queue def consumer(q): # .定义消费者函数来生成在消费者的子进程 num = q.get() # .通过q.get()来获取队列里的数据 if num == None # 判断当num的数据是None的时候就执行下边的代码 print("队列空了...") else: # 当条件不成立的时候就打印这个数 print(num) def producer(q): # 定义来生成生产者的子进程 for i in range(10): # 连续生产10个数 num = i+1 q.put(num) # 把生产出来的数放到队列里 q.put(None) # 当数据生产完毕,就在队列里放一个None if __name__ == "__main__": q = Queue() # .实例化一个队列的对象,括号里可以放数,表示队列可以放多少数据 con = Process(target=consumer,args=(q,)) pro = Process(target=producer,args=(q,)) con.start() pro.start()
###第二种方法###在主程序q.put(None)来控制消费者是否全部去到了生产者的数据(主进程和子进程之间的通信)
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# 此时消费者结束即可 # 消费者如何判断,生产者是没来得及生产数据,还是生产者不再生产数据了? # 如果你尝试用get_nowait() + try 的方式去尝试获得生产者不再生产数据,此时是有问题的。 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,'alex','