生产者消费者模型及队列,进程池
Posted hdy19951010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者消费者模型及队列,进程池相关的知识,希望对你有一定的参考价值。
生产者消费者模型
生产者消费者模型
主要是为了解耦
可以借助队列来实现生产者消费者模型
栈 : 先进后出(First In Last Out 简称 FILO)
队列 : 先进先出(First In First Out 简称 FIFO)
import queue #不能进行多进程之间的数据传输
(1) from multiprocessing import Queue #借助Queue解决生产者消费者模型,队列是安全的
q=Queue(num)
num : 队列的最大长度
q.get() #阻塞等待获取数据,如果有数据就直接获取,如果没有数据就阻塞等待
q.put() #阻塞,如果可以继续往队列中放数据,就直接放,不能放就阻塞等待
q.get nowait() #不阻塞,如果有数据直接获取,没有数据就报错
q.put nowait() #不阻塞,如果哦可以继续往队列中放数据,就直接放,不能放就报错
(2) from multiprocessing import JoinableQueue #可连接的队列
JoinableQueue 是继承Queue,所以可以使用Queue中的方法
q.join() #用于生产者.等待 q.task done的返回结果,通过返回结果,生产者就能获得消费者消费了多少个数据
q.task done() #用于消费者,是指每消费队列中一个数据,就给join返回一个标识
回调函数的使用:
进程的任务函数的返回值,被当成回调函数的形参接收到,以此进行进一步的操作
回调函数是由主进程调用的,而不是子进程,子进程只负责把结果传递给回调函数
from multiprocessing import Queue,Process import time # 消费者 def con(q,name): while 1: info=q.get() #消费 if info: #如果有就打印,否则break print(‘%s拿走了%s‘%(name,info)) else: break # 生产者 def sh(q,product): for i in range(10): info=product+‘版娃娃%s号‘% str(i) print(info) q.put(info) #生产 q.put(None) if __name__==‘__main__‘: q=Queue(10) #队列长度10(可以自己设定) p=Process(target=sh,args=(q,‘大雄‘)) p_1=Process(target=con,args=(q,‘alex‘)) p.start() #执行子进程 p_1.start() #执行子进程
队列实现 生产者消费者模型
模块:from multiprocessing import Queue,Process
from multiprocessing import Queue,Process def xiao(q,name,color): # 这里的 color 是颜色的传参 while 1: ret=q.get() # 消费 q.get() if ret: print(‘%s%s拿走了%s娃娃 33[0m‘% (color,name,ret)) # color接收的是颜色的传参而且是开头,所以color要放在前面 else: break #当消费者在数据队列中拿到None的时候,就是拿到了生产者不再生产数据的标识,此时消费者结束消费即可 def sheng(q,ban): for i in range(0,12): ret=ban+‘版娃娃第%s号‘% str(i) # print(ret) q.put(ret) # 生产 q.put(变量) if __name__==‘__main__‘: q=Queue(15) #队列长度 p2 = Process(target=sheng, args=(q, ‘小熊‘)) #开启生产者子进程 p1=Process(target=xiao,args=(q,‘ko‘,‘