Python自学笔记多线程生产者与消

前言

单单说起消费者这个名词大家都不陌生,每个人都是消费者,生产者也可以类比得知其含义。不仅仅是在生活当中,在编程中,当处理多线程问题时候也会涉及到这两个名词。

现实生活中,生产者产出消费者的物资,以供消费者使用。多线程任务处理中有常有这样的场景,一个线程获取数据,另外的一个或多个线程用另外线程获取的数据进行高级的算法处理,这种就是简单的生产者与消费者的模型。

应用

在专业仪表的软件开发中,生产者与消费者的模型是相当重要和常见的,比如我之前开发的一款仪器,采集卡专门负责数据的采集以及一些简单的数据初级处理,采集卡把超级大量的数据流疯狂的输出,上位机通过相关的接口获取这些数据,这么大的数据量必须有恰当的软件模型来处理才能正常运作。

其中一部分我加入了生产者与消费者的模型,开辟一个线程缓存接口上的数据,开辟另外的一个线程再去处理这些“已经安顿好”的数据,这样可以“悠闲自得”的处理数据而不用担心数据溢出或者丢失了。

这种模型在代码上怎么实现呢,这篇文章通过一个简单的程序快速的帮你认识这种模型。

切入场景

假如你去烧烤店去吃烧烤,你需要的是烤串,你是消费者,假设烤串是店主生产制造加工的,那么店主是生产者,假设店主一次只能烤一个肉串,必须等烤串凑够5个才可以满盘上桌,这就涉及到了使用条件变量保持线程同步的问题。

验证思路:

首先我们开辟两个线程,一个线程模拟生产者,一个线程模拟消费者,通过两个线程的运作掌握生产者消费者模型运转的机制,同时学习多线程同步的另外一种方式:使用条件变量保持线程同步。

演示代码

运行结果

过程分析

在程序中我们设计一个变量num模拟盘子中烤串的数量,生产者线程模拟烧烤店主烤串,每烤好一个烤串就放到盘子里面,烤串数目累加,当达到5个(模拟数据准备好),可以通知消费者来取用了,数目5的判断就是条件变量,当条件变量满足时候,产生了一个notify(),通知消费者线程取用数据,在消费者取用数据的期间生产者进入等待状态,消费者取用烤串(数据),当数据取用完毕或者快完时候,通知生产者继续往盘子里面(数据缓冲区)存放烤串(数据),循环往复。

后记

这个例子的模型比较简单的,不考虑效率问题,其实仔细分析,不管是生产者还是消费者都有太多的等待空闲,只要有等待和空闲就会产生效率低下的问题。本文重在理解这种模型,至于模型优化和效率提升的部分我会持续在下文更新出来,感兴趣的可以持续


转载请注明:http://www.aierlanlan.com/tzrz/2898.html