并发编程 之 生产者消费者模型

Posted fxc-520520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程 之 生产者消费者模型相关的知识,希望对你有一定的参考价值。

1 什么是生产者消费者模型
生产者:比喻的是程序中负责产生数据的任务
消费者:比喻的是程序中负责处理数据的任务

生产者->共享的介质(队列)<-消费者

2 为何用
实现了生产者与消费者的解耦和,生产者可以不停地生产,消费者也可以不停地消费
从而平衡了生产者的生产能力与消费者消费能力,提升了程序整体运行的效率

什么时候用?
当我们的程序中存在明显的两类任务,一类负责产生数据,另外一类负责处理数据
此时就应该考虑使用生产者消费者模型来提升程序的效率

from multiprocessing import JoinableQueue,Process
import time
import os
import random

def producer(name,food,q):
for i in range(3):
res=‘%s%s‘ %(food,i)
time.sleep(random.randint(1,3))
# 往队列里丢
q.put(res)
print(‘33[45m%s 生产了 %s33[0m‘ %(name,res))
# q.put(None)

def consumer(name,q):
while True:
#从队列里取走
res=q.get()
if res is None:break
time.sleep(random.randint(1,3))
print(‘33[46m%s 吃了 %s33[0m‘ %(name,res))
q.task_done()

if __name__ == ‘__main__‘:
q=JoinableQueue()
# 生产者们
p1=Process(target=producer,args=(‘egon‘,‘包子‘,q,))
p2=Process(target=producer,args=(‘杨军‘,‘泔水‘,q,))
p3=Process(target=producer,args=(‘猴老师‘,‘翔‘,q,))
# 消费者们
c1=Process(target=consumer,args=(‘Alex‘,q,))
c2=Process(target=consumer,args=(‘wupeiqidsb‘,q,))
c1.daemon=True
c2.daemon=True

p1.start()
p2.start()
p3.start()
c1.start()
c2.start()

p1.join()
p2.join()
p3.join()

q.join() #等待队列被取干净
# q.join() 结束意味着
# 主进程的代码运行完毕--->(生产者运行完毕)+队列中的数据也被取干净了->消费者没有存在的意义

# print(‘主‘)































































以上是关于并发编程 之 生产者消费者模型的主要内容,如果未能解决你的问题,请参考以下文章

并发编程之多进程3 (生产者与消费者模型) 回调函数

python学习_day35_并发编程之多进程3

转: Java并发编程之十三:生产者—消费者模型(含代码)

python并发编程之多线程守护系列互斥锁生产者消费者模型

百万年薪python之路 -- 并发编程之 多线程 一

python并发编程之多进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型