频道栏目
首页 > 资讯 > Python > 正文

python 生产者与消费者模型

18-06-17        来源:[db:作者]  
收藏   我要投稿

真正开发中不会用该方法在同一台机器上这样操作,该文章只是提供一种解决方案和思路

【用途】

程序中有两类
一类负责生产数据(生产者)
一类负责处理数据(消费者)
用于平衡两者的速度差 与 程序揭开耦合

生产者<——>列队<——>消费者

# 原理,生产者将生产的对象丢到队列里边,消费者从队列里边取出数据

import time
from multiprocessing import Queue
from multiprocessing import Process

def producer(q):  # 生产者
 for i in range(5):
  res = '包子%s' % i
  time.sleep(1)  # 模拟延时
  print('生产者生产了:%s' % res)
  q.put(res)  # 把生产的放进容器

def consumer(q):  # 消费者
 while True:
  res = q.get()  # 从容器中取出来消费
  if res is None:
break
  time.sleep(2)  # 模拟延时
  print('消费者吃了%s' % res)

if __name__ == '__main__':
 # 容器
 q = Queue()
 # 生产者
 p = Process(target=producer, args=(q,))  # 把容器传进去
 # 消费者
 c1 = Process(target=consumer, args=(q,))

 p.start()
 c1.start()
 # 因为子进程是循环,所以会导致子禁止一直在循环
 p.join()  # 这样可以保证在生产者生产完后执行代码
 q.put(None)  # 传一个None 在消费者内取值判断,如果多个生产者就传入多个 q.put(None)

【另外一种列队JoinableQueue 】

比Queue更高级,在处理主进程完毕后,子进程仍然运行的问题上

import time
from multiprocessing import JoinableQueue
from multiprocessing import Process


def producer(q):  # 生产者
 for i in range(5):
  res = '包子%s' % i
  time.sleep(1)  # 模拟延时
  print('生产者生产了:%s' % res)
  q.put(res)  # 把生产的放进容器
 q.join()  # 等待取空

def consumer(q):  # 消费者
 while True:
  res = q.get()  # 从容器中取出来消费
  if res is None:
break
  time.sleep(2)  # 模拟延时
  print('消费者吃了%s' % res)
  q.task_done()  # 通知有一个数据被取走

if __name__ == '__main__':
 # 容器
 q = JoinableQueue()
 q.join()
 # 生产者
 p = Process(target=producer, args=(q,))  # 把容器传进去
 # 消费者
 c1 = Process(target=consumer, args=(q,))
 c1.daemon = True  # 设置为守护进程

 p.start()
 c1.start()

 p.join()  # 等主进程运行完,q.join也运行完了,所以用守护进程结束掉子进程即可
相关TAG标签
上一篇:java编程开发分派问题解析
下一篇:Windows系统下的git安装教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站