LabVIEW框架-生产者消费者
如果程序开发者面对这样一个需求:既要实时采集一个通讯数据,又要将数据进行解析、显示、纪录等等一系列操作,那么我们应该如何实现。
如果我们可以选择使用简单状态机进行处理,流程图如下:
但是由于简单状态机只有一个线程,“数据处理”状态如果耗时过多,就不能及时采集数据,这样将会造成数据丢失。
针对于上述问题,我们本节引入生产者消费者框架。
生产者消费者
现在我们大部分人都在使用外卖服务,在我们点外卖的过程中会有三个对象参与:餐饮店、外卖小哥、顾客。而生产者和消费者框架中也包含三个与之对应的参与对象:生产者进程、队列、消费者进程。两个系统的对应关系如下图:
通过与外卖业务的对比我们可以总结出生产者消费者框架有以下几个优势:
解耦
传统的进店消费模式老板直接面对顾客们,老板如果给顾客们上菜需要知道顾客们的座位号,而使用外卖业务以后老板不需要面对那么多顾客,他只需将餐食交给快递小哥,后面的事就不用再关心。
同样生产者消费者框架中的生产者如果需要向外传输数据,它也不需要找到数据的消费者,它只需把数据交给队列就可以了。
这样就减少了生产者和消费者之间的关联关系,降低了耦合强度。
支持并发
传统的进店消费模式中,我们经常见到这样一种情景:店里满员以后店员就要停下来等有人消费完成以后才能迎接下一位顾客;而使用外卖业务以后,餐饮店将顾客的餐食制作完成后,无论顾客是否消费完成,它都可以接下一个订单,顾客的消费进程和餐饮店的接单进程同时进行,互相之间不受制约。
由于生产者消费者框架中使用了两个独立进程,生产者将接受到的数据放进队列以后,它就可进行下一次数据接受,不再受到消费者处理的进度影响,两者可以同时进行。
支持忙闲不均
餐饮店里的大师傅手艺好,做菜快,很迅速地就把菜做完给外卖小哥去配送,他就可以空闲下来。这时快递小哥就起到了暂时保管餐食的作用,他站在楼下等顾客一份一份将外卖取走。
同样,生产者消费者框架中遇到忙闲不均的情况,队列就会起到数据缓存的作用。
下面就是一个生产者消费者的应用程序:
实例:
此程序创建了生产者和消费者两个进程:生产者进程从TCP中读取数据,如果有数据则将数据插入到队列中;消费者进程从队列中读取数据,延时200ms后将数据和当前时间连接显示到字符串控件。
生产者关闭进程后会释放队列引用,消费者利用元素出队列产生的错误关闭自身进程。
运行结果如下: