26.1-生产者消费者模型
根本没有那条“更好的路”,只有一条路,就是你选择的那条路。关键是,你要勇敢地走上去,而且要坚持走下去!
生产者消费者模型
对于一个监控系统,需要处理很多数据,包括日志。对其中已有数据的采集、分析。
被监控对象就是数据的生产者producer,数据的处理程序就是数据的消费者consumer。
生产者和消费者速度要不匹配的问题;
解决办法:—队列queue;最好消费者速度快一些,好一点;
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。
日志生产者往往会部署好几个程序,日志产生的也很多,而消费者也会有多个程序,去提取日志分析处理。
数据的生产是不稳定的!可能会造成短时间数据的“潮涌”,需要缓冲。
消息队列处理数据的方式有两种:
1.排一队;
2.排多队;
大型系统使用消息队列往往是第三方消息中间件:RabbitMQ、RocketMQ、Kafka;
集群、
进程版本与线程版本q
生产者消费者问题是线程模型中的经典问题,该模型的应用和变种非常多,不赘述!
queue模块
queue模块提供了一个先进先出的队列Queue;
queue.Queue(maxsize=0)
创建FIFO队列,返回Queue对象。
maxsize 小于等于0,队列长度没有限制。
Queue.get(block=True, timeout=None)
从队列中移除元素并返回这个元素
block 为 阻塞,timeout为超时。
如果block为True,是阻塞,timeout为None就是一直阻塞。
如果block为True但是timeout有值,就阻塞到一定秒数抛出Empty异常。
block为False,是非阻塞,timeout将被忽略,要么成功返回一个元素,要么抛出empty异常。